Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 189

 
Youri Lazurenko:

У меня так и есть - открытие ордера с нулевыми ТП и СЛ, а потом уже модифицируется (ордер) с нужными параметрами ТП и СЛ. Я уже писал, все работает и работало нормально на других счетах, только на ndd такая фигня. До этого ни у кого с подобными счетами не работал, не могу сравнить. Может это бздык только форекс4ю, а может всех ndd-счетов. Хотелось бы узнать для дальнейшего.
Раз у вас ошибка 130, значит смотрите параметры стоп-приказов. В любом случае они должны быть не ближе, чем величина StopLevel, заданная в настройках сервера. Если она равно нулю, то используйте двойной спред+1 пункт
 
Youri Lazurenko:

У меня так и есть - открытие ордера с нулевыми ТП и СЛ, а потом уже модифицируется (ордер) с нужными параметрами ТП и СЛ. Я уже писал, все работает и работало нормально на других счетах, только на ndd такая фигня. До этого ни у кого с подобными счетами не работал, не могу сравнить. Может это бздык только форекс4ю, а может всех ndd-счетов. Хотелось бы узнать для дальнейшего.

При открытии позиций, для расчёта корректных стопов и тейков используйте эти функции:

//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
   if(stop_loss==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
   else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
   if(take_profit==0) return(0);
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
   int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
   else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
   int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
   int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
   return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
 
Alexey Viktorov:

А в чём разница

Pips = Charge/Lots/Tickvalue в конкретных цифрах 8/2/4 = 1

или

Pips = Charge/(Lots*Tickvalue) в конкретных цифрах 8/(2*4) = 8/8 = 1

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


Разница в том, что мой тёзка ещё на  Point  зачем-то умножает: (OrderCommission()/(tv*OrderLots()))*Point()
 
Artyom Trishkin:
Раз у вас ошибка 130, значит смотрите параметры стоп-приказов. В любом случае они должны быть не ближе, чем величина StopLevel, заданная в настройках сервера. Если она равно нулю, то используйте двойной спред+1 пункт


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

Дело в том, что у меня вообще не устанавливаются стопы (усреднение). И почему этой ошибки нет при утреннем запуске терминала и происходит модификация, а только присутствует (ошибка) в начале сессии при открытии ордера (дневные графики) и если он один на паре. В техподдержке ответили, что ни по времени, ни по расстоянию (величина спреда это не существенно) для модификации ограничений нет. 

Пока по-экспериментирую с учетом всех рекомендаций, а потом буду делать выводы.

Еще раз большое спасибо.

 
Vitalie Postolache:

Разница в том, что мой тёзка ещё на  Point  зачем-то умножает: (OrderCommission()/(tv*OrderLots()))*Point()

Хорошо, отвечу: Есть цена 1.0520, при расчётах мы получили число (int)Comm, дальше нам нужно его прибавить/отнять от цены = 1.0520 + (int)Comm ?  Вот теперь чтоб при мат.операции не множить на Point - это сделано сразу.

 
Youri Lazurenko:


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

Дело в том, что у меня вообще не устанавливаются стопы (усреднение). И почему этой ошибки нет при утреннем запуске терминала и происходит модификация, а только присутствует (ошибка) в начале сессии при открытии ордера (дневные графики) и если он один на паре. В техподдержке ответили, что ни по времени, ни по расстоянию (величина спреда это не существенно) для модификации ограничений нет. 

Пока по-экспериментирую с учетом всех рекомендаций, а потом буду делать выводы.

Еще раз большое спасибо.

Не за что.

Использовать так: в функцию открытия позиции вместо стопа в пунктах вписать вызов функции, в которую подставить стоп в пунктах. Либо сразу цену стопа вписывать - компилятор сам выберет нужную функцию. Тоже самое для тейков.

Пример:

double price=SymbolInfoDouble(Symbol(),SYMBOL_ASK);         // Цена открытия для Buy
double sl=CorrectStopLoss(Symbol(), OP_BUY, price, 200);    // Стоп в 200 пунктов (вместо пунктов можно вписать расчётную цену, например Ask+200*Point() или значение цены МА)
double tp=CorrectTakeProfit(Symbol(), OP_BUY, price, 300);  // Тейк в 300 пунктов (если вписать расчётную цену, то будет использоваться тип функции с double-параметром)
OrderSend(Symbol(),OP_BUY,Lots,price,slippage,sl,tp,"Комментарий ордера",Magic,0,clrBlue);
 
Vitaly Muzichenko:

Хорошо, отвечу: Есть цена 1.0520, при расчётах мы получили число (int)Comm, дальше нам нужно его прибавить/отнять от цены = 1.0520 + (int)Comm ?  Вот теперь чтоб при мат.операции не множить на Point - это сделано сразу.


Ну тогда может и так. Просто вопрос изначально ставился как перевести комиссию в пипсы, а не в цену.
 
Artyom Trishkin:

Не за что.

Использовать так: в функцию открытия позиции вместо стопа в пунктах вписать вызов функции, в которую подставить стоп в пунктах. Либо сразу цену стопа вписывать - компилятор сам выберет нужную функцию. Тоже самое для тейков.

Пример:

Еще раз огромное спасибо. Всех благ.
 
Уважаемые знатоки подскажите пожалуйста : строю линии фибоначи цвет и стиль уровней разный а выставляется всё время такой же как у последнего, как исправить? перерисовка и слип не омогають ни в каком месте(

                  ObjectCreate(0,Fibo_Arrow,OBJ_FIBO,0,Time[0],Close[0],Time[0],price); // создание метки стпа на графике   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_HIDDEN,true);        // Запрет на показ имени графического объекта в списке объектов 
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_SELECTABLE,false);   // запрет на выделение перемещение объекта мышью   
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_RAY_RIGHT,false);    // луч вправо
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_TOOLTIP,"r\n");       // подпись линии и и её длины в подсказку                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_COLOR,1,clrNONE);       // цвет   
                  
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELS,3);           // установим количество уровней   
                      
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,0,1.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,0,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,0,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,0,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,0,"0.5"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,1,2);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,1,Lime);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,1,0);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,1,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,1,"1"); // описание уровня 
                  
                  ObjectSetDouble(0,Fibo_Arrow,OBJPROP_LEVELVALUE,2,2.5);  // значение уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELCOLOR,2,Green);  // цвет уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELSTYLE,2,2);     // стиль уровня       
                  ObjectSetInteger(0,Fibo_Arrow,OBJPROP_LEVELWIDTH,2,0);     // толщина уровня 
                  ObjectSetString(0,Fibo_Arrow,OBJPROP_LEVELTEXT,2,"1.5"); // описание уровня 

  
 
Money_Maker:
Уважаемые знатоки подскажите пожалуйста : строю линии фибоначи цвет и стиль уровней разный а выставляется всё время такой же как у последнего, как исправить? перерисовка и слип не омогають ни в каком месте(

Фибо уровни таким объектом нельзя сделать разных стилей и цветов для каждой линии. Рисуйте отдельными линиями, если надо радугу.
Причина обращения: