Интересный момент, который обнаружился случайно

 

Привет всем! Писал сегодня такую штуку:

void OpenOrder(string symbol,int cmd)
{
   double price=0,lot=0;
   color clr=0;
   
   if(cmd==0)
   {
      clr=clrBlue;
      price=NormalizeDouble(Ask,_Digits);
   }
   if(cmd==1)
   {
      clr=clrRed;
      price=NormalizeDouble(Bid,_Digits);
   }
   string TEXT=ObjectGetString(0,"Lot",OBJPROP_TEXT);
   StringReplace(TEXT,",",".");
   ObjectSetString(0,"Lot",OBJPROP_TEXT,TEXT);
   lot=StringToDouble(TEXT);
   
   if(!CheckVolumeValue(NormalizeDouble(lot,2)))
   {
      if(!IsTesting())return;
      else lot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   }
   if(!OrderSend(symbol,cmd,NormalizeDouble(lot,2),price,10,0,0,"Project 143",Magic,0,clr))
   {
      Print("Error = ",GetLastError(),"  ",cmd,"  ",lot,"  ",price);
   }
}

Это для открытия ордеров на другой валютной паре (типа мультивалютник), проверил на демо - работает, все правильно открывается... НО, позже обнаружил ошибку: price неправильно присвоено, у меня Ask и Bid а должно быть price=SymbolInfoDouble(symbol,SYMBOL_ASK) и price=SymbolInfoDouble(symbol,SYMBOL_BID) соответственно... Кто скажет почему на демо корректно работал не правильный код??

 
При Market Execution цена открытия игнорируется. Вот если бы попробовали со значениями cmd, большими 1, то сразу получили бы ошибку. Так что еще и значение cmd нужно проверять на входе.
 
Maksim Neimerik:

Привет всем! Писал сегодня такую штуку:

Это для открытия ордеров на другой валютной паре (типа мультивалютник), проверил на демо - работает, все правильно открывается... НО, позже обнаружил ошибку: price неправильно присвоено, у меня Ask и Bid а должно быть price=SymbolInfoDouble(symbol,SYMBOL_ASK) и price=SymbolInfoDouble(symbol,SYMBOL_BID) соответственно... Кто скажет почему на демо корректно работал не правильный код??

_Digits

надо через маркет инфо, для конкретного символа

OrderSend(symbol,cmd,NormalizeDouble(lot,2),price,10,0,0,"Project 143",Magic,0,clr)

рекомендую price,0,0,0 ибо с 10-кой вход  будет не точным.

лучше ловить реквоты, чем заходить там, где выгоднее рынку, а не трейдеру.

лот лучше закидывать в функцию внешним параметром

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

с теми же правилами пишется функция на закрытие.

такой подход с аском и бидом вряд ли уже заработает на демо