OrderCheck() Вопросы - страница 4

 
TheXpertА еще желательно не советовать новичкам писать неправильный код. Объем нормализуется с учетом LotStep и Min Max Lot, но никак не _Digits.
Вы же ему вообще ничего не посоветовали, с Ваших-то "высот". А с проблемами  LotStep, Min Max Lot и _Digits мы бы с ним и сами как-нибудь разобрались.
 
Спасибо, mario065. Значит, был запрос у меня сформирован не полностью. Хотя делал так, как дано в справке- указал обязательные 9 полей. Теперь из Вашегопримнра добавил еще 2 поля и запрос заработал. 
 
Спасибо всем, замечания учту. Просьба, приведите пример с нормализацией объема с помощью LotStep. В справке не нашел.
 
rusland1962: Просьба, приведите пример с нормализацией объема с помощью LotStep. В справке не нашел.
 Извините за "проклятый копипаст". Посмотрите отсюда https://www.mql5.com/ru/forum/1111/page444#comment_78315  и далее по обсуждению. В своё время делал нечто подобное с использованием MathLog10 - отлично работало, но под рукой сейчас нет.
 
rusland1962:
Спасибо всем, замечания учту. Просьба, приведите пример с нормализацией объема с помощью LotStep. В справке не нашел.

Я вот по условие чампионата(принимал участия толко в первий раз на МТ4) готовю ЕА.

За лот пишу вот так:

if(Lots > 5.00 && Lots < 10.00){
   FLots = NormalizeDouble(5.00,2); SLots = NormalizeDouble(Lots - 5.10,2);}
Если лот которий нужен болше 5 и менше 10-так думаю понятна. 

 

 

Вот ка внешная функция-ето для добавки:

double RoundLots(double Lots)
  {
   double Result;
   double MinLots,MaxLots,Bid,Ask,FreeMragin,LotSize;
   long   Leverage;
   MinLots   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   MaxLots   = SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   Bid       = SymbolInfoDouble(_Symbol,SYMBOL_BID);
   Ask       = SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   LotSize   = SymbolInfoDouble(_Symbol,SYMBOL_TRADE_CONTRACT_SIZE);
   Leverage  = AccountInfoInteger(ACCOUNT_LEVERAGE);
   FreeMragin= AccountInfoDouble(ACCOUNT_FREEMARGIN);

   Result = MathMax(MinLots,MathMin(MaxLots,MathCeil(Lots/MinLots)*MinLots));
  
   //while(Result>=2*MinLots && Result*NormalizeDouble((Ask+Ask-Bid),_Digits)*NormalizeDouble((LotSize/Leverage),2)>=FreeMragin)
      //Result=NormalizeDouble((Result-MinLots),2);
   //if(Result<MinLots)
      //Sleep(5000);
   while(Result>=2*MinLots && Result*(NormalizeDouble(Ask,_Digits)+NormalizeDouble(Ask,_Digits)-NormalizeDouble(Bid,_Digits))*(LotSize/Leverage)>=FreeMragin)
      Result=Result-MinLots;
   if(Result>5)
      Result=5;  
   return(Result);
  }
Ну конечно можно разписат ка надо кому то.
Документация по MQL5: Основы языка / Функции / Описание внешних функций
Документация по MQL5: Основы языка / Функции / Описание внешних функций
  • www.mql5.com
Основы языка / Функции / Описание внешних функций - Документация по MQL5
 

Вот такой код:

double CorrectLot(double lot, string symbol = "")
{
   if (symbol == "") symbol = _Symbol;

   double min = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MIN);
   double max = SymbolInfoDouble(symbol, SYMBOL_VOLUME_MAX);
   double step= SymbolInfoDouble(symbol, SYMBOL_VOLUME_STEP);
   
   double lots = MathRound(lot/step)*step;
   if (lots > max) lots = max;
   if (lots < min) lots = 0;
   
   return lots;
}

еще ни разу не вызывал проблем.


 
TheXpert:

Вот такой код:

еще ни разу не вызывал проблем.


Предпоследняя строчка,

if (lots < min) lots = 0;

может лучше

if (lots < min) lots = min;

?

Зачем нулевой лот?

 
i_logic:
Не, только так.
 
TheXpert:


еще ни разу не вызывал проблем.


Могут возникнуть в общем случае, если например min=lot=0.1, а шаг=0.3