Советник перестал открывать сделки

 

Добрый вечер, проблема в том что торгую роботом на терминале mt5 и столкнулся сегодня со следующей ошибкой : 2020.08.12 10:39:01.521 Trendsovrev (SILV-9.20,M5) CTrade::OrderSend: exchange buy 0.00 SILV-9.20 sl: 25.42 tp: 26.47 [invalid volume]

до этого робот торговал без каких либо ошибок и в настройках указан "1" лот а в ошибке почему то "0" . Абсолютно ничего не менял, с чем это связано разобрать не могу. Буду очень признателен если дадите хоть какие то комментарии по данной ошибке и сможете помочь. Заранее спасибо

 
snithez:

Добрый вечер, проблема в том что торгую роботом на терминале mt5 и столкнулся сегодня со следующей ошибкой : 2020.08.12 10:39:01.521 Trendsovrev (SILV-9.20,M5) CTrade::OrderSend: exchange buy 0.00 SILV-9.20 sl: 25.42 tp: 26.47 [invalid volume]

до этого робот торговал без каких либо ошибок и в настройках указан "1" лот а в ошибке почему то "0" . Абсолютно ничего не менял, с чем это связано разобрать не могу. Буду очень признателен если дадите хоть какие то комментарии по данной ошибке и сможете помочь. Заранее спасибо

Исправьте объём в строке 15789.

 
Vladimir Karputov:

Исправьте объём в строке 15789.

Не, не в этой строке. Вот я сейчас напряг зрение и вижу, что ошибка в строке 17864.

 
Vladimir Karputov:

Исправьте объём в строке 15789.

я так понимаю это намёк на то что для понимания проблемы нужен код робота? 

тогда вот 


#include <777\777.mqh>             // Подключаем торговый класс CTrade

input double LT      = 1; // лот
input double KL      = 1;    // увеличение лота
input double ML      = 10;   // максимальный лот
input int    Stop    = 200;  // стоплосс
input int    Take    = 300;  // тейкпрофит
input int    Slip    = 100;  // проскальзывание
input bool   Rev     = 0;    // true-реверс

input string IndName       = "111";
input uint      =  20;   // 
input double      =  2;    // 

input string IndName2      = "2222";
enum enMaTypes
  {
   ma_sma,    // Simple moving average
   ma_ema,    // Exponential moving average
   ma_smma,   // Smoothed MA
   ma_lwma    // Linear weighted MA
  };
input int       inpMaPeriod      = 7;        // Smoothing period
input enMaTypes inpMaMetod       = ma_lwma;  // Smoothing method
input int       inpStep          = 0;        // Step size
input bool      inpBetterFormula = false;    // Use better formula


int RiskHandle=0,HAHandle=0,bars=0;
double up[1],dn[1],op[1],cl[1];

CTrade trade;                // Используем торговый класс CTrade
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   RiskHandle=iCustom(_Symbol,0,IndName,PeriodBands,Deviation);
   HAHandle=iCustom(_Symbol,0,IndName2,inpMaPeriod,inpMaMetod,inpStep,inpBetterFormula);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=LT;

   if(HistorySelect(0,TimeCurrent()))
     {
      double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT);
      double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME);
      if(profit>0)
         lot=LT;
      if(profit<0)
         lot=LastLot*KL;
     }
   if(lot>ML)
      lot=LT;

   return(lot);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double sl=0,tp=0;

   double open=iOpen(NULL,0,1);
   double close=iClose(NULL,0,1);
   double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);

   CopyBuffer(RiskHandle,0,1,1,up);
   CopyBuffer(RiskHandle,1,1,1,dn);

   CopyBuffer(HAHandle,0,1,1,op);
   CopyBuffer(HAHandle,3,1,1,cl);

   bool buy=close>up[0] && open<up[0] && cl[0]>op[0];
   bool sell=close<dn[0] && open>dn[0] && cl[0]<op[0];

   if(Rev)
     {
      buy=close<dn[0] && open>dn[0] && cl[0]<op[0];
      sell=close>up[0] && open<up[0] && cl[0]>op[0];
     }

   if(PositionsTotal()<1 && bars!=Bars(NULL,0))
     {
      if(buy)
        {
         sl=NormalizeDouble(Bid-Stop*_Point,_Digits);
         tp=NormalizeDouble(Bid+Take*_Point,_Digits);
         trade.PositionOpen(_Symbol,0,Lot(),Ask,sl,tp);
        }

      if(sell)
        {
         sl=NormalizeDouble(Ask+Stop*_Point,_Digits);
         tp=NormalizeDouble(Ask-Take*_Point,_Digits);
         trade.PositionOpen(_Symbol,1,Lot(),Bid,sl,tp);
        }
      bars=Bars(NULL,0);
     }

   Comment("\n UP: ",up[0],
           "\n DN: ",dn[0],
           "\n HOP: ",op[0],
           "\n HCL: ",cl[0]);
  }
//+------------------------------------------------------------------+


 

Блок проверяет только условие "если больше":

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=LT;

   if(HistorySelect(0,TimeCurrent()))
     {
      double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT);
      double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME);
      if(profit>0)
         lot=LT;
      if(profit<0)
         lot=LastLot*KL;
     }
   if(lot>ML)
      lot=LT;

   return(lot);
  }

но нет никакой защиты, для случая, когда "если меньше или равен нулю".

 
Vladimir Karputov:

Блок проверяет только условие "если больше":

но нет никакой защиты, для случая, когда "если меньше или равен нулю".

Добрый день, большое спасибо за ответ. Но я не совсем понимаю почему это была причина если лот был в настройках равен "1"  ? и до этого дня всё работало. Данного робота писал не я ,а человек этот сейчас на связь не выходит. Правильно ли я понял что для того что бы подобной ошибки больше не было данный кусок кода должен выглядеть следующим образом:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=LT;

   if(HistorySelect(0,TimeCurrent()))
     {
      double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT);
      double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME);
      if(profit>0)
         lot=LT;
      if(profit<0)
         lot=LastLot*KL;
     }
   if(lot>ML)
      lot=LT;

   if(lot<ML)
      lot=LT;

   return(lot);
  }
 
snithez:

Добрый день, большое спасибо за ответ. Но я не совсем понимаю почему это была причина если лот был в настройках равен "1"  ? и до этого дня всё работало. Данного робота писал не я ,а человек этот сейчас на связь не выходит. Правильно ли я понял что для того что бы подобной ошибки больше не было данный кусок кода должен выглядеть следующим образом:

Этот кусок кода вообще лишний - Вы задаёте во входных параметрах постоянный лот.

 
Vladimir Karputov:

Этот кусок кода вообще лишний - Вы задаёте во входных параметрах постоянный лот.

Просто как я понимаю этот кусок кода для мартингейла или я не прав? Я правильно понял что должно быть так и тогда этой ошибки не будет? просто не совсем понятно почему она вообще появилась если до этого неделю проблем не было вообще. и количество лотов не менялось. Заранее спасибо за ответ

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=LT;

   if(HistorySelect(0,TimeCurrent()))
     {
      double profit=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_PROFIT);
      double LastLot=HistoryDealGetDouble(HistoryDealGetTicket(HistoryDealsTotal()-1),DEAL_VOLUME);
      if(profit>0)
         lot=LT;
      if(profit<0)
         lot=LastLot*KL;
     }
 

   return(lot);
  }
 
snithez:

Просто как я понимаю этот кусок кода для мартингейла или я не прав? Я правильно понял что должно быть так и тогда этой ошибки не будет? просто не совсем понятно почему она вообще появилась если до этого неделю проблем не было вообще. и количество лотов не менялось. Заранее спасибо за ответ

А у Вас есть мартингейл?

 
Vladimir Karputov:

Этот кусок кода вообще лишний - Вы задаёте во входных параметрах постоянный лот.

Тут похоже на мартингейл. Если последняя сделка с профитом то объем не меняется. Если был убыток, то в новой сделке объем равен объему в последней сделке умноженному на KL. Далее проверяется если получившийся объем больше максимального (ML) то новый объем устанавливается равным LT (начальному объему).

По идее должно все работать. Я подозреваю, что в параметрах эксперта значение KL установлено равным нулю. Тогда получается, если была убыточная сделка 

if(profit<0) lot=LastLot*KL;  А так как KL = 0 то в итоге объем будет равный нулю.

...

В общем примитивный код. Такой только на демо гонять. Интересно сколько человек заплатил за такую поделку.

 
Vitalii Ananev:

Тут похоже на мартингейл. Если последняя сделка с профитом то объем не меняется. Если был убыток, то в новой сделке объем равен объему в последней сделке умноженному на KL. Далее проверяется если получившийся объем больше максимального (ML) то новый объем устанавливается равным LT (начальному объему).

По идее должно все работать. Я подозреваю, что в параметрах эксперта значение KL установлено равным нулю. Тогда получается, если была убыточная сделка 

if(profit<0) lot=LastLot*KL;  А так как KL = 0 то в итоге объем будет равный нулю.

Это на словах якобы будет работать. На самом деле:

1. Не нужно качать всю истории сделок от сотворения мира до сего дня

2. Нужно обязательно проверять ТИП сделки (BUY или SELL), ТИП ВХОДА/ВЫХОДА в рынок.

3. После увеличения лота ОБЯЗАТЕЛЬНО проверить корректность лота - полученный лот должен соответствовать шагу лота, не должен быть больше максимума или меньше минимума 

4. ...

Причина обращения: