Удаётся-ли Вам опубликовать свой продукт без ошибок с первого раза? - страница 11

 

Как говорится за что боролись ...

Ограничений по торговым парам нет, все проверки есть.

Выкладываю продукт не первый раз и знаю какие проверки идут.

Дайте сюда этого модератора )))

 
Vladimir Zubov:

Как говорится за что боролись ...

Ограничений по торговым парам нет, все проверки есть.

Выкладываю продукт не первый раз и знаю какие проверки идут.

Дайте сюда этого модератора )))


попробуйте обсудить подробнее со своим модератором в переписке каждый нюанс...

 
Nikolay Gaylis:

попробуйте обсудить подробнее со своим модератором в переписке каждый нюанс...


Статью читал десять раз и публиковал продукты с первого раза. Код на все проверки у меня не менялся.

Администрация! Вы или правила дополните или обновите публикацию.

https://www.mql5.com/ru/articles/2555

Какие проверки должен пройти торговый робот перед публикацией в Маркете
Какие проверки должен пройти торговый робот перед публикацией в Маркете
  • 2016.07.19
  • MetaQuotes Software Corp.
  • www.mql5.com
Все продукты Маркета перед публикацией проходят обязательную предварительную проверку, так как небольшая ошибка в логике советника или индикатора может привести к убыткам на торговом счете. Именно поэтому нами разработана серия базовых проверок, призванных обеспечить необходимый уровень качества продуктов Маркета. Если в процессе проверки...
 

Вот Модератор Маркета, проц AMD в сокет Intel ставит ? А если и ставит то жалуется что не работает ?

 
Nikolay Gaylis:

попробуйте обсудить подробнее со своим модератором в переписке каждый нюанс...

У меня в коде сидит проверка на свободного маржа
Такая как она должна быт здесь:
https://www.mql5.com/ru/articles/2555#not_enough_money
По сколько модераторы заставляет валидатор торговать без деньгами  в аккаунте ,конечно советник не хочет торговать без деньги
В итоге :
 Если ест проверка при марджин <0 валидатор не пропускает эксперт по сколько нет ордера - there are no trading operations
Eсли нет проверка автом валидатор пропускает но тогда модератор не пропускает поскольку идет бесконечная  ошибка 134 в тестере

И что надо обсуждать?
То что модераторы хотят невозможного
 

раньше все с первого раза проходило.

теперь намного усложнил основной алгоритм который отвечает за открытие и сопровождение сделок и ппц - прошел только с 5го раза.

так все норм, согласен, все честно, но мне вот только единственное не нравится, что минимальный стоп уровень пришлось сравнивать со спредом*3

 
Stefan Stoyanov:
У меня в коде сидит проверка на свободного маржа
Такая как она должна быт здесь:
https://www.mql5.com/ru/articles/2555#not_enough_money
По сколько модераторы заставляет валидатор торговать без деньгами  в аккаунте ,конечно советник не хочет торговать без деньги
В итоге :
 Если ест проверка при марджин <0 валидатор не пропускает эксперт по сколько нет ордера - there are no trading operations
Eсли нет проверка автом валидатор пропускает но тогда модератор не пропускает поскольку идет бесконечная  ошибка 134 в тестере

И что надо обсуждать?
То что модераторы хотят невозможного

нате кусочек кода, думаю разберетесь

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OrderOpen(ENUM_ORDER_TYPE cmd,double lots,int distance,int slippage,int _stoploss,int _takeprofit,string comment=NULL,int magic=0,datetime expiration=0,color arrow_color=clrNONE)
  {
   if(AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)==0 || AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)>Buys+Sells+BuyLimit+SellLimit+BuyStop+SellStop)
     {
     if(OrdersTotal()<AccountInfoInteger(ACCOUNT_LIMIT_ORDERS) || AccountInfoInteger(ACCOUNT_LIMIT_ORDERS)==0)
        {
      if(lots<SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN))lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
      if(lots>SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX))lots=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
      //lots=NormalizeDouble(lots,(int)(MathLog(1.0/SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP))/MathLog(10.0)));
      lots=MathMin(MathMax(MathRound(lots/SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP))*SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP),SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN)),SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX));

      if((AccountFreeMargin()<MarketInfo(_Symbol,MODE_MARGINREQUIRED)*lots) || 
         //(AccountFreeMargin()<SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL)*lots) || 
         (AccountFreeMarginCheck(_Symbol,((cmd==OP_SELL || cmd==OP_SELLLIMIT || cmd==OP_SELLSTOP)?OP_SELL:OP_BUY),lots)<
         MarketInfo(_Symbol,MODE_MARGINREQUIRED)*MarketInfo(_Symbol,MODE_MINLOT)))
        {
         Print("NOT ENOUGH MONEY TO OPEN TRADE "+DoubleToStr(lots,2)+" LOT.  MAXIMUM LOT = "+DoubleToStr(MaxLot(),2));
         if(GetLastError()!=0)Print("FUNCTION = ",__FUNCTION__,"  LINE = ",__LINE__,"  ERROR = ",GetLastError());
         Sleep(1000);
         RefreshRates();
         return;
        }

      if((ENUM_SYMBOL_TRADE_MODE)SymbolInfoInteger(_Symbol,SYMBOL_TRADE_MODE)==SYMBOL_TRADE_MODE_FULL)
        {
         double oop=(OrdersType==1?
                     (cmd==OP_BUYSTOP?SymbolInfoDouble(_Symbol,SYMBOL_ASK)+MathMax(distance,MathMax(spread,MathMax(stopslevel,freezelevel)))*_Point:
                     SymbolInfoDouble(_Symbol,SYMBOL_BID)-MathMax(distance,MathMax(spread,MathMax(stopslevel,freezelevel)))*_Point):
                     (cmd==OP_BUYLIMIT?SymbolInfoDouble(_Symbol,SYMBOL_ASK)-MathMax(distance,MathMax(spread,MathMax(stopslevel,freezelevel)))*_Point:
                     SymbolInfoDouble(_Symbol,SYMBOL_BID)+MathMax(distance,MathMax(spread,MathMax(stopslevel,freezelevel)))*_Point));

         if(!OrderSend(_Symbol,cmd,lots,
            OrdersType!=3?oop:SymbolInfoDouble(_Symbol,cmd==OP_SELL?SYMBOL_BID:SYMBOL_ASK),
            slippage,0,0,comment,magic,expiration,arrow_color))
           {
            if(GetLastError()!=0)Print("FUNCTION = ",__FUNCTION__,"  LINE = ",__LINE__,"  ERROR = ",GetLastError());
            Sleep(1000);
            RefreshRates();
           }
        }
     }
     }
   else
     {
      if(GetLastError()!=0)Print("FUNCTION = ",__FUNCTION__,"  LINE = ",__LINE__,"  ERROR = ",GetLastError());
      Sleep(1000);
      RefreshRates();
     }
  }
 

У меня все гораздо просто
Я не имею проблемы с определения недостатком  денег ,неправильные объёмы и так далее
Робот на MQL4 и все как по учебнике из
https://www.mql5.com/ru/articles/2555#not_enough_money
https://www.mql5.com/ru/articles/2555#invalid_lot :
У меня сидит междинны параметр  alert  
если все нормално  alert =0;
если где то не так то alert =1;
И тогда /
{if (alert==1 ) return(0);}
Но валидатор говорит
test on EURUSD,H1
there are no trading operations
test on NZDUSD,H1
there are no trading operations
test on GBPUSDcheck,M30
there are no trading operations
test on XAUUSDcheck,Daily
there are no trading operations

Все это совершенно непонятно мне
Как можно просить робота торговать без денег и с неправильны объем и когда он этого не делает, говорить что это ошибка

 
Stefan Stoyanov:

.....................

проверки с моего кода пропишите и все будет ОК.

кстати вот еще нужные куски, переменные объявите в самом начале

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void MarketInformation()
  {
   spread=(int)MathMax((SymbolInfoDouble(_Symbol,SYMBOL_ASK)-SymbolInfoDouble(_Symbol,SYMBOL_BID)/_Point),
           MathMax(MarketInfo(_Symbol,MODE_SPREAD),SymbolInfoInteger(_Symbol,SYMBOL_SPREAD)));

   stopslevel=(int)MathMax(spread*3+(int)(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point),
               MathMax(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_STOPS_LEVEL),MarketInfo(_Symbol,MODE_STOPLEVEL)))+
               (int)(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point);

   freezelevel=(int)MathMax(spread*3+(int)(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point),
                MathMax(SymbolInfoInteger(_Symbol,SYMBOL_TRADE_FREEZE_LEVEL),(int)MarketInfo(_Symbol,MODE_FREEZELEVEL)))+
                (int)(SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)/_Point);

   if(tickvalue==0)
     {
      for(int i=0; i<OrdersTotal(); i++)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
           {
            if(OrderSymbol()==_Symbol && (OrderMagicNumber()==MagicNumber || MagicNumber==-1))
              {
               if(OrderType()==OP_BUY)
                 {
                  if(OrderProfit()!=0)tickvalue=MathAbs(OrderProfit()/((OrderClosePrice()-OrderOpenPrice())/Point)/OrderLots());
                 }
               if(OrderType()==OP_SELL)
                 {
                  if(OrderProfit()!=0)tickvalue=MathAbs(OrderProfit()/((OrderClosePrice()-OrderOpenPrice())/Point)/OrderLots());
                 }
              }
           }
        }
     }
   return;
  }

+

 

Ну и что?


После  MarketInformation();    у Вас проверяется ,непонятно почему, некоторые переменные:

spread,freezelevel,tickvalue;

 Результат бесконечной ряд ошибок в тестере:

2018.01.19 14:41:28.390    2017.03.15 22:04:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 11, FreeMargin: -9.73
2018.01.19 14:41:28.390    2017.03.15 22:04:00  Tester: not enough money for buy 0.01 EURUSD at 1.07284 sl: 0.00000 tp: 0.00000 [2017.03.15 22:04]
2018.01.19 14:41:28.390    2017.03.15 22:04:00  !            Counter Multi  3 EURUSD,H1: OrderSend error 134
2018.01.19 14:41:28.390    2017.03.15 22:04:00  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 11, FreeMargin: -9.73
2018.01.19 14:41:28.390    2017.03.15 22:04:00  Tester: not enough money for buy 0.01 EURUSD at 1.07283 sl: 0.00000 tp: 0.00000 [2017.03.15 22:04]
2018.01.19 14:41:28.390    2017.03.15 22:03:47  !            Counter Multi  3 EURUSD,H1: OrderSend error 134
2018.01.19 14:41:28.390    2017.03.15 22:03:47  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 11, FreeMargin: -9.72
2018.01.19 14:41:28.390    2017.03.15 22:03:47  Tester: not enough money for buy 0.01 EURUSD at 1.07262 sl: 0.00000 tp: 0.00000 [2017.03.15 22:03]
2018.01.19 14:41:28.390    2017.03.15 22:03:47  !            Counter Multi  3 EURUSD,H1: OrderSend error 134
2018.01.19 14:41:28.390    2017.03.15 22:03:47  Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 11, FreeMargin: -9.72


Такой результат я легко получаю и через свои функции если нет условие

  // {if (alert==1 ) return(0);}   

конечно валидатор можно пропустить такой код но потом модератор не пропускает

Если У Вас ест идея как ограничить бесконечного ряда ошибок до несколько  щук то можно   получится