После нескольких сделок пишет GBPUSD,M1: invalid lots amount for OrderSend function

 
После нескольких сделок пишет GBPUSD,M1: invalid lots amount for OrderSend function
 

Скорее всего, блок ММ советника увеличивает или уменьшает изначальный размер лота (в зависимости от текущего размера депозита) в недопустимое (например - дробное) число раз для данного ДЦ

Попробуйте в СВОЙСТВАХ отключить ММ и работать постоянным лотом.

 
Нормализуйте значения лота которое передается в OrderSend, типа ret_lot = NormalizeDouble(ret_lot, a);
 

я даже так делал:

double L=0; //максимально возможный объем для открытия позиции на данный момент

//код вычисления размера лота в зависимости от обстоятельств :)

double LotStep=MarketInfo(Symbol(),24);  //MODE_LOTSTEP     Шаг изменения размера лота
//грануляция объема:  
double N=L/LotStep;    //делим полученный объем на минимальный шаг лота. Возможно, получено нецелое число. Неверная грануляция объема.
int Z=MathFloor(N); //целое количество минимальных шагов в нашем лоте
L=Z*LotStep;           //грануляция объема соответствует требованиям ДЦ  
 
PPC:

я даже так делал:


Для полноты картины хорошо бы проверить соответствие размера лота на минимальное и максимальное значение: MarketInfo с идентификаторами запроса

MODE_MINLOT и MODE_MAXLOT

Хотя из кода видно, что Вы пытаетесь открыть позицию с нулевым объемом:

double L=0; //максимально возможный объем для открытия позиции на данный момент

 
PPC:

я даже так делал:

В основном все размеры лота - это степени 10-ки .... можно и так - по принципу армии: безобразно, но однообразно )))))))

    mnLotSz        = MarketInfo(nSYMBOL,MODE_MINLOT);
    mnLotStp       = MarketInfo(nSYMBOL,MODE_LOTSTEP);
    nLotsDigits    = MathCeil(MathAbs(MathLog(MathMin(mnLotSz,mnLotStp)))/MathLog(10));
......................................
    Lots = NormalizeDouble(Lots,nLotsDigits);


Удачи.

 
VladislavVG:

В основном все размеры лота - это степени 10-ки .... можно и так - по принципу армии: безобразно, но однообразно )))))))


Удачи.

Удачи )
 
Mislaid:


Для полноты картины хорошо бы проверить соответствие размера лота на минимальное и максимальное значение: MarketInfo с идентификаторами запроса

MODE_MINLOT и MODE_MAXLOT

Хотя из кода видно, что Вы пытаетесь открыть позицию с нулевым объемом:


Вы долго думали, прежде чем такое сказать? DDDD

в серединке есть однозначная строчка коммента: //код вычисления размера лота в зависимости от обстоятельств :)
которая недвусмысленно поясняет, что рабочая часть кода где-то там... (на моем компе, например, или туда можно усердно запихать что-нибудь свое - главное, чтобы оно было впихуемое!)

и, кстати, проверка на макс и мин у меня также имеется - просто здесь я её не озвучивал.

 
PPC:


Вы долго думали, прежде чем такое сказать? DDDD

в серединке есть однозначная строчка коммента: //код вычисления размера лота в зависимости от обстоятельств :)
которая недвусмысленно поясняет, что рабочая часть кода где-то там... (на моем компе, например, или туда можно усердно запихать что-нибудь свое - главное, чтобы оно было впихуемое!)

и, кстати, проверка на макс и мин у меня также имеется - просто здесь я её не озвучивал.

Я вообще не думал. Увидел, что приведенный код не работает, и сразу ляпнул. Извините.
 
Mislaid:
Я вообще не думал. Увидел...
))))))))))))
 

А у меня такое решение.

По методу Черепах.)) Риск менеджмент присутствует !

   double capitalKoeficient = 1;
   double unitProcent = 2;
   int ATRPeriod = 20;
   double lotStoimostShaga = MarketInfo(Symbol(), MODE_TICKVALUE);
   double lotMinSize = MarketInfo(Symbol(), MODE_MINLOT);
   double lotMaxSize = MarketInfo(Symbol(), MODE_MAXLOT);
   double lotMinStep = MarketInfo(Symbol(), MODE_LOTSTEP);
   if (lotStoimostShaga <= 0) return(0); /// Эт типа если ничего не известно, то нечего и делать.
   double riskVolatilnost = NormalizeDouble(iATR(NULL, 0, ATRPeriod, 1), Digits);
   double riskVValute = riskKoeficient * lotStoimostShaga * riskVolatilnost / Point;
   double capitalVUpravlenii = AccountEquity() * capitalKoeficient;
   double unitVValute = capitalVUpravlenii * unitProcent / 100;
   double unitLotSize = unitVValute / riskVValute;
   if (unitLotSize < lotMinSize)
     {
      unitLotSize = 0;
     }
   else
     {
      int k = MathFloor((unitLotSize - lotMinSize) / lotMinStep);
      unitLotSize = lotMinSize + lotMinStep * k;
      if (unitLotSize > lotMaxSize) unitLotSize = lotMaxSize;
     }
   /// Ну а при посылке сигнала на открытие: если размер лота равен нулю
   /// выдает алерт мол: сигнал есть но риск менеджмент не позволяет)))
Причина обращения: