Jump to content

ошибка 4051


concord99

Recommended Posts

concord99

Пожалуйста, подскажите - где ошибка неправильного параметра функции в строке:

 

SellTicket = OrderSend(Symbol(), OP_SELL, 0.03, Bid, 5, Bid+30*Point, Bid-300*Point, "Sell Order", 0, 0, Green);

Link to post
Share on other sites
qqmber

Какой тип счета? Классик?


Gone.

Link to post
Share on other sites
concord99
Какой тип счета? Классик?

 

Микро

Link to post
Share on other sites
qqmber

Занятно, но я не вижу ошибки. SL/TP не нормализованы, но это не должно 4051 ошибку вызывать. У вас это хорошо воспроизводится, или как повезет?


Gone.

Link to post
Share on other sites
expforex2
Пожалуйста, подскажите - где ошибка неправильного параметра функции в строке:

 

SellTicket = OrderSend(Symbol(), OP_SELL, 0.03, Bid, 5, Bid+30*Point, Bid-300*Point, "Sell Order", 0, 0, Green);

 

если не считать что в каждом действии есть противодействие, и этот код не похож на код:

в данном коде по параметрам ошибок нет.

 

З.Ы. Я не беру в счет проверку лота, нормализация, обработка ошибок и так далее.


Ищите программиста? могу помочь..

Link to post
Share on other sites
-Алексей-
Занятно, но я не вижу ошибки. SL/TP не нормализованы, но это не должно 4051 ошибку вызывать. У вас это хорошо воспроизводится, или как повезет?

А при чём тут SL/TP?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение параметра функции

Это может быть и тикет ордера, и даже неправильно заданный цвет стрелки... И может быть совсем не в этой строке кода.

Откуда уверенность, что ошибку даёт именно эта строка?

Link to post
Share on other sites
concord99
А при чём тут SL/TP?

ERR_INVALID_FUNCTION_PARAMVALUE 4051 Недопустимое значение параметра функции

Это может быть и тикет ордера, и даже неправильно заданный цвет стрелки... И может быть совсем не в этой строке кода.

Откуда уверенность, что ошибку даёт именно эта строка?

 

 

 

Вот весь код:

 

//+------------------------------------------------------------------+

//| ccc.mq4 |

//| Copyright © 2011, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "VAGEYEV"

#include <stdlib.mqh>

 

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int UseSlippage;

extern int Slippage = 5;

 

int init()

{

//----

 

UseSlippage = GetSlippage(Symbol(),Slippage);

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

 

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

 

double LotSize = 0.1;

int SellTicket;

 

// Calculate open price, stop loss and take profit

double OpenPrice = NormalizeDouble(Bid,Digits);

double TakeProfit = NormalizeDouble(Bid-0.03,Digits);

double StopLoss = NormalizeDouble(Bid+0.003,Digits);

Print(OpenPrice," ",TakeProfit," ",StopLoss);

// Open Sell Order

if (SellTicket==0)

{

SellTicket = OrderSend(Symbol(),OP_SELL,3*LotSize,OpenPrice,UseSlippage,StopLoss,TakeProfit,"Sell Order",0,0,Green);

 

if (SellTicket==-1)

{

int ErrorCode = GetLastError();

string ErrDesc = ErrorDescription(ErrorCode);

Print(ErrorCode," ",ErrDesc);

string ErrAlert = StringConcatenate(ErrorCode,": ",ErrDesc);

Alert(ErrAlert);

}

}

//----

return(0);

}

 

 

// Get Slippage Function

int GetSlippage(string Currency, int SlippagePips)

{

int CalcDigits = MarketInfo(Currency,MODE_DIGITS);

if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;

else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;

return(CalcSlippage);

}

//+------------------------------------------------------------------+

 

Теперь почему-то выдаёт ошибку 130 - неверный стоп. 30 пунктов - это достаточно большая дистанция.

Попробовал у другого брокера - где после точки - 4 цифры, а не 5 - всё сработало.

...

Выходит, либо у Альпари что-то вдруг поменялось или там где 5 знаков - не работает.

...Хотя ранее весь код работал и в Альпари.:roll:

Edited by concord99
Link to post
Share on other sites
-Алексей-

В этом коде действительно единственная строка которая может выдать ошибку. Но до её редактирования всё работало как часики. А вот после твоего вмешательства SL/TP стали не нормализованными и могут вызывать ошибку 4051, а ошибку 130 вызывает SL который стал равен Bid+30*Point то-есть всего 3 пункта, а стоплевел на микро =спред*2 и при спреде 15 и выше обязательно будет ошибка 130.

Link to post
Share on other sites
concord99
В этом коде действительно единственная строка которая может выдать ошибку. Но до её редактирования всё работало как часики. А вот после твоего вмешательства SL/TP стали не нормализованными и могут вызывать ошибку 4051, а ошибку 130 вызывает SL который стал равен Bid+30*Point то-есть всего 3 пункта, а стоплевел на микро =спред*2 и при спреде 15 и выше обязательно будет ошибка 130.

 

Я пробовал по стопу указывать конкретное число, намного дальше от текущей. Всё равно выдаёт ошибку 130. :(

 

И ещё - пробовал у разных брокеров - где 4хзнак (после точки) - работает, где 5-тизнак-не работает.

 

Алексей, пожалуйста, подскажи - что мне надо исправить? Размер стопа мне нужен ровно 30. По евро спрэд вряд ли может быть больше 15.

 

Заранее благодарен за совет...

Link to post
Share on other sites
qqmber

У вас пробел стоит Use Slippage

Как такое вообще смогло скомпилироваться?


Gone.

Link to post
Share on other sites
concord99
У вас пробел стоит Use Slippage

Как такое вообще смогло скомпилироваться?

 

это почему-то здесь появился.... в коде - его нет

Link to post
Share on other sites
Мэкс

Я забил код в скрипт, и нормально открывает по рынку, без ошибок...

Кстати, это условие:

if (SellTicket==0)

{

}

Если это скрипт, то условие совершенно бесполезное, так как ограничивать количество ордеров в скрипте не имеющем циклов, без смысленно.

Но если этот код из експерта, то так вы тоже не ограничите количество ордеров, так как переменная int SellTicket; инициализируется(обнуляется) в функции int start(){} на каждом тике.

Нужно вынести int SellTicket; за пределы Старта, то- есть вверх!

И тогда это условие будет физически ограничивать количество устанавливаемых ордеров, так как при установке ордера переменная получит не нулевое значение.

Link to post
Share on other sites
-Алексей-
У вас пробел стоит Use Slippage

Как такое вообще смогло скомпилироваться?

Пробелы появляются после вставки скопированного кода в сообщение на форуме. Так-что этого пробела наверняка в коде нет.

Link to post
Share on other sites
-Алексей-

И ещё - пробовал у разных брокеров -(после точки) - работает, -не работает.

 

Алексей, пожалуйста, подскажи - что мне надо исправить? Размер стопа мне нужен ровно 30. По евро спрэд вряд ли может быть больше 15.

 

Заранее благодарен за совет...

Давай сначала разберёмся "ровно 30" это сколько? Если 30 где 4хзнак значит надо ставить 300 там где 5-тизнак.

Потом, зачем тебе именно так прописывать СЛ/ТП, почему ты игнорируешь эти строки

 

double StopLoss = NormalizeDouble(Bid+0.003,Digits);

double TakeProfit = NormalizeDouble(Bid-0.03,Digits);



 

Это ведь и есть StopLoss=30 TakeProfit=300 полноценных пунктов

Link to post
Share on other sites
concord99
Давай сначала разберёмся "ровно 30" это сколько? Если 30 где 4хзнак значит надо ставить 300 там где 5-тизнак.

Потом, зачем тебе именно так прописывать СЛ/ТП, почему ты игнорируешь эти строки

 

double StopLoss = NormalizeDouble(Bid+0.003,Digits);

double TakeProfit = NormalizeDouble(Bid-0.03,Digits);



 

Это ведь и есть StopLoss=30 TakeProfit=300 полноценных пунктов

 

ок...Алексей, мне надо 30 нормальных пунктов (то есть 1/3 фигуры, цента).

Что мне надо изменить?

 

Заранее благодарен за помощь

 

/+------------------------------------------------------------------+

//| ccc.mq4 |

//| Copyright © 2011, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "VAGEYEV"

#include <stdlib.mqh>

 

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int UseSlippage;

extern int Slippage = 3;

 

int init()

{

//----

 

UseSlippage = GetSlippage(Symbol(),Slippage);

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

 

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

 

double LotSize = 0.1;

int SellTicket;

 

// Calculate open price, stop loss and take profit

double OpenPrice = NormalizeDouble(Bid,Digits);

double TakeProfit = NormalizeDouble(Bid-3000*Point,Digits);

double StopLoss = NormalizeDouble(Bid+300*Point,Digits);

Print(OpenPrice," ",TakeProfit," ",StopLoss, " ",Digits);

// Open Sell Order

if (SellTicket==0)

{

SellTicket = OrderSend(Symbol(),OP_SELL,3*LotSize,OpenPrice,UseSlippage,StopLoss,TakeProfit,"Sell Order",0,0,Green);

 

if (SellTicket==-1)

{

int ErrorCode = GetLastError();

string ErrDesc = ErrorDescription(ErrorCode);

Print(ErrorCode," ",ErrDesc);

string ErrAlert = StringConcatenate(ErrorCode,": ",ErrDesc);

Alert(ErrAlert);

}

}

//----

return(0);

}

 

 

// Get Slippage Function

int GetSlippage(string Currency, int SlippagePips)

{

int CalcDigits = MarketInfo(Currency,MODE_DIGITS);

if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;

else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;

return(CalcSlippage);

}

//+------------------------------------------------------------------+

Link to post
Share on other sites
-Алексей-

Не сочти за грубость, но тебе ведь всё разжевали. Ты почему-то проигнорировал ответ Мэкса, а там тоже правильное замечание.

В таком виде эта ... поставит тебе максимально допустимое к-во ордеров или пока деньги не кончатся для маржи.

Link to post
Share on other sites
concord99
Не сочти за грубость, но тебе ведь всё разжевали. Ты почему-то проигнорировал ответ Мэкса, а там тоже правильное замечание.

В таком виде эта ... поставит тебе максимально допустимое к-во ордеров или пока деньги не кончатся для маржи.

 

:no: ... это только часть кода)

 

просьба уточнить - что же надо исправить в той строке, которая выдает ошибку 130...если это несложно)

Link to post
Share on other sites
-Алексей-

Кроме замечаний Мэкса ничего.

Link to post
Share on other sites
kazakov.v
:no: ... это только часть кода)

 

просьба уточнить - что же надо исправить в той строке, которая выдает ошибку 130...если это несложно)

 

У Вас точно instant execution? Руками позволяет сразу при открытии ставить стопы?


Никому верить нельзя.

Мне - можно.

 

Link to post
Share on other sites
-Алексей-
У Вас точно instant execution? Руками позволяет сразу при открытии ставить стопы?

На НДД как не странно не даёт ошибку 130, просто молча не ставит ордера. Вчера с этим сталкивался. А в тестере открывает без вопросов со стопами и тейками.

Link to post
Share on other sites
concord99
Кроме замечаний Мэкса ничего.

 

я внёс изменения по Максу... всё равно выдаёт ошибку 130 на пятизнаке, а на 4хзнаке всё равботает. менял размер стопа до 300 пунктов...ни хрена не хочет пятизнак работать...значит это проблема MQL

 

всё равно спасибо за советы

Link to post
Share on other sites
-Алексей-

Какая может быть проблема MQL ???

Почему-же ни у меня, ни у Мэкса, ни у Казакова, это только те кто ответил тебе, никаких проблем нет, а у тебя проблемы MQL...

Сначала найди откуда эта ошибка появляется. Сначала ты говоришь "Вот весь код" потом опять повторяешь "Это только часть кода". Так это весь код или нет??? Как я и заподозрил изначально, так видимо и есть "Ошибка идёт не от этой строки."

Link to post
Share on other sites
concord99
Какая может быть проблема MQL ???

Почему-же ни у меня, ни у Мэкса, ни у Казакова, это только те кто ответил тебе, никаких проблем нет, а у тебя проблемы MQL...

Сначала найди откуда эта ошибка появляется. Сначала ты говоришь "Вот весь код" потом опять повторяешь "Это только часть кода". Так это весь код или нет??? Как я и заподозрил изначально, так видимо и есть "Ошибка идёт не от этой строки."

 

для меня очевидно, что это проблема пятизнака....это истинное проклятие :(

Link to post
Share on other sites
concord99
Я забил код в скрипт, и нормально открывает по рынку, без ошибок...

Кстати, это условие:

if (SellTicket==0)

{

}

Если это скрипт, то условие совершенно бесполезное, так как ограничивать количество ордеров в скрипте не имеющем циклов, без смысленно.

Но если этот код из експерта, то так вы тоже не ограничите количество ордеров, так как переменная int SellTicket; инициализируется(обнуляется) в функции int start(){} на каждом тике.

Нужно вынести int SellTicket; за пределы Старта, то- есть вверх!

И тогда это условие будет физически ограничивать количество устанавливаемых ордеров, так как при установке ордера переменная получит не нулевое значение.

 

Мэкс, спасибо за комментарии. Я внёс некоторые изменения. Сразу уточню - это часть советника. Но, ошибка 130 может возникать только в строке где OrderSend.

Почему-то в 4-хзнаке всё работает, а в пятизнаке - выдаёт по-прежнему ошибку 130.

Возможно, как опытный программист вы сможете найти неточность или роковую ошибку пятизнака.

 

Заранее благодарен, если подскажите.

 

//+------------------------------------------------------------------+

//| ccc.mq4 |

//| Copyright © 2011, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

//+------------------------------------------------------------------+

#property copyright "VAGEYEV"

#include <stdlib.mqh>

 

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int UseSlippage;

double UsePoint;

 

extern int Slippage = 5;

 

extern double StopLoss = 30;

extern double T_P=300;

extern int MagicNumber = 0;

 

int init()

{

//----

 

UsePoint = PipPoint(Symbol());

UseSlippage = GetSlippage(Symbol(),Slippage);

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

 

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

//----

 

double LotSize = 0.01;

 

// Open buy order

while(IsTradeContextBusy()) Sleep(10);

RefreshRates();

 

 

// Calculate stop loss and take profit

double OpenPrice = Ask;

double StopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL) * Point;

double UpperStopLevel = Ask + StopLevel;

double LowerStopLevel = Bid - StopLevel;

 

double MinStop = 5 * UsePoint;

 

// Calculate stop loss and take profit

if(StopLoss > 0) double BuyStopLoss = OpenPrice - (StopLoss * UsePoint);

 

if(T_P > 0) double BuyTakeProfit = OpenPrice + (T_P * UsePoint);

 

//Verify stop loss and take profit

if(BuyStopLoss > 0 && BuyStopLoss > LowerStopLevel)

{

BuyStopLoss = LowerStopLevel - MinStop;

}

 

if(BuyTakeProfit > 0 && BuyTakeProfit < UpperStopLevel)

{

BuyTakeProfit = UpperStopLevel + MinStop;

}

 

int BuyTicket = OrderSend(Symbol(),OP_BUY,3*LotSize,OpenPrice,UseSlippage,BuyStopLoss,BuyTakeProfit,"Buy Order",MagicNumber,0,Green);

 

 

if (BuyTicket==-1)

{

int ErrorCode = GetLastError();

string ErrDesc = ErrorDescription(ErrorCode);

Print(ErrorCode," ",ErrDesc);

string ErrAlert = StringConcatenate(ErrorCode,": ",ErrDesc);

Alert(ErrAlert);

}

 

//----

return(0);

}

 

 

// Get Slippage Function

int GetSlippage(string Currency, int SlippagePips)

{

int CalcDigits = MarketInfo(Currency,MODE_DIGITS);

if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;

else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;

return(CalcSlippage);

}

 

// Pip Point Function

double PipPoint(string Currency)

{

int CalcDigits = MarketInfo(Currency,MODE_DIGITS);

if(CalcDigits == 2 || CalcDigits == 3) double CalcPoint = 0.01;

else if(CalcDigits == 4 || CalcDigits == 5) CalcPoint = 0.0001;

return(CalcPoint);

}

//+------------------------------------------------------------------+

Link to post
Share on other sites
Мэкс

Обнулил СЛ и ТП, и установил их модификацией.

//+------------------------------------------------------------------+
//| ccc.mq4 |
//| Copyright © 2011, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "VAGEYEV"
#include <stdlib.mqh>

//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
extern double StopLoss   = 30;
extern double TakeProfit = 300;
extern double LotSize    = 0.1;
extern int Slippage      = 5;

int SellTicket,UseSlippage;
double PointDigits;
int init()
{
//----
PointDigits=Point*IncreasePoint(); //Нормализация поинта
UseSlippage = GetSlippage(Symbol(),Slippage);
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
// Calculate open price, stop loss and take profit
  double OpenPrice = NormalizeDouble(Bid,Digits);
  double tp = NormalizeDouble(Bid-TakeProfit*PointDigits,Digits);
  double sl = NormalizeDouble(Bid+StopLoss*PointDigits,Digits);
  Print(OpenPrice," ",tp," ",sl);
// Open Sell Order
  if (SellTicket==0) {
     SellTicket = OrderSend(Symbol(),OP_SELL,3*LotSize,OpenPrice,UseSlippage,0,0,"Sell Order",0,0,Green);
     if (SellTicket==-1) {
        int ErrorCode = GetLastError();
        string ErrDesc = ErrorDescription(ErrorCode);
        Print(ErrorCode," ",ErrDesc);
        string ErrAlert = StringConcatenate(ErrorCode,": ",ErrDesc);
        Alert(ErrAlert);
     }else{
        Alert("Ура Ордер открылся!!!");
        if (OrderModify(SellTicket,NormalizeDouble(OpenPrice,Digits),sl,tp,0)) {                                          
           Alert("Установка СЛ и ТП тоже прошла успешно!");
           return;
        }Alert("Но установка стопов, провалилась.  , OpenPrice= ",OpenPrice," sl= ",sl," tp= ",tp,", err= ",GetLastError());
     }
  }return(0);
}


// Get Slippage Function
int GetSlippage(string Currency, int SlippagePips)
{
int CalcDigits = MarketInfo(Currency,MODE_DIGITS);
if(CalcDigits == 2 || CalcDigits == 4) double CalcSlippage = SlippagePips;
else if(CalcDigits == 3 || CalcDigits == 5) CalcSlippage = SlippagePips * 10;
return(CalcSlippage);
}
//+------------------------------------------------------------------+


int IncreasePoint() {
  int d=Digits;
  if(d==3 || d==5)return(10);
  return(1);
}

 

И добавил правильный расчёт поинта... Ф-ию расчёта поинта, взял на этом форуме.

Link to post
Share on other sites
  • Capman locked this topic
Guest
This topic is now closed to further replies.
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...