Ошибка Invalid price в тестере стратегий - страница 2

 
Vitalii Ananev:
Это не для того что бы узнать какая ошибка, а для того что бы вывести значения переменных при которых возникает эта ошибка для последующего анализа причины ошибки. Может вы передаете в функцию модификации ордера отрицательные значения или эти значения получаются внутри спреда. 
с модификацией как я написал выше ошибку победил дело не в отрицательных и ли каких либо еще значениях, а в шаге цены. Осталось победить ошибку неверной цены при открытии позиции, вот лог тестера что можете сказать
Файлы:
20160316.log  343 kb
 
Sergey Gritsay:
с модификацией как я написал выше ошибку победил дело не в отрицательных и ли каких либо еще значениях, а в шаге цены. Осталось победить ошибку неверной цены при открытии позиции, вот лог тестера что можете сказать

Зачем мне лог тестера, вы его смотрели? Вы там видите причину ошибки? 

Говорю же после каждого какого либо действия с ордером вызывайте GetLastError если он больше нуля выводите значения переменных в журнал. Шаг цены можно получить SYMBOL_TRADE_TICK_SIZE

 
Vitalii Ananev:

Зачем мне лог тестера, вы его смотрели? Вы там видите причину ошибки? 

Говорю же после каждого какого либо действия с ордером вызывайте GetLastError если он больше нуля выводите значения переменных в журнал. Шаг цены можно получить SYMBOL_TRADE_TICK_SIZE

Видимо мы с вами не понимаем друг-друга, как получить шаг цены я знаю. Давайте попробуем решить такую задачу

вводные данные:

шаг цены инструмента 0,01 указан в спецификации инструмента

текущая цена по инструменту bid = 1209.378 ask = 1209.678

как нам открыть сделку по текущей цене если сервер ее не принимает, так как котировка приходит с шагом  0,001

 
Sergey Gritsay:

Видимо мы с вами не понимаем друг-друга, как получить шаг цены я знаю. Давайте попробуем решить такую задачу

вводные данные:

шаг цены инструмента 0,01 указан в спецификации инструмента

текущая цена по инструменту bid = 1209.378 ask = 1209.678

как нам открыть сделку по текущей цене если сервер ее не принимает, так как котировка приходит с шагом  0,001

Попробуйте сравнивать последний пришедший тик с предыдущим и если изменения меньше чем указан в спецификации инструмента (в данном случае 0.01) не открывать сделку если больше то открывать.
 
Vitalii Ananev:
Попробуйте сравнивать последний пришедший тик с предыдущим и если изменения меньше чем указан в спецификации инструмента (в данном случае 0.01) не открывать сделку если больше то открывать.
А если ни когда не придет котировка кратная шагу 0,01 или придет когда сигнал на открытие уже потерял свою актуальность. Просто суть вопроса в чем получается сервер брокера настроен не правильно. На реалтайм котировках такой ошибки не встречал, только в тестере, а из-за нее не принимаю продукт в маркет, попробуйте любой из своих советников запустить на этих инструментах на сервере MetaQuotes-Demo думаю получите аналогичную ошибку.
 
Sergey Gritsay:
А если ни когда не придет котировка кратная шагу 0,01 или придет когда сигнал на открытие уже потерял свою актуальность. Просто суть вопроса в чем получается сервер брокера настроен не правильно. На реалтайм котировках такой ошибки не встречал, только в тестере, а из-за нее не принимаю продукт в маркет, попробуйте любой из своих советников запустить на этих инструментах на сервере MetaQuotes-Demo думаю получите аналогичную ошибку.
Возможно, что и сервер настроен неправильно. На моей практике такого не было, как правило такая ошибка встречается из за неверных параметров передаваемых при открытии или модификации позиции.
 
В общем решил проблему пока таким способом, Если у кого будут еще какие идеи, пишите свои варианты
//+------------------------------------------------------------------+
//|                                                      Test_04.mq5 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
CTrade trade;
int m_atr=0;
int Period_ATR=21;
ENUM_TIMEFRAMES TF_ATR=PERIOD_CURRENT;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   double price=0.0;
   double volume=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   int digits=(int)SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
   double ts=SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE);
   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   //if(bid<=0.0 || ask<=0.0)return;

   if(!PositionSelect(_Symbol))
     {
      if(NormalizeDouble(normalize(_Symbol,ask),digits)!=NormalizeDouble(ask,digits))return;
      //Print(_Symbol,": bid = ",bid," ask = ",ask);
      trade.Buy(volume,_Symbol);
      trade.PrintRequest();
      trade.PrintResult();
     }

   double SL=Dynamic_Stop(_Symbol,3);
   double TP=Dynamic_Stop(_Symbol,6);

   Modify(_Symbol,SL,TP);
   Trailing_Stop(_Symbol,SL);
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
void Modify(string symbol,double sl,double tp)
  {
   if(sl<0 || tp<0)return;
   double price=0.0;
   double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);

   if(bid<=0.0 || ask<=0.0)return;

   if(PositionSelect(symbol))
     {
      if(PositionGetDouble(POSITION_SL)==0 && PositionGetDouble(POSITION_TP)==0)
        {
         price=PositionGetDouble(POSITION_PRICE_OPEN);
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
           {
            //tp=NormalizeDouble(normalize(symbol,bid+tp*point),digits);
            //sl=NormalizeDouble(normalize(symbol,bid-sl*point),digits);
            tp=NormalizeDouble(normalize(symbol,price+tp*point),digits);
            sl=NormalizeDouble(normalize(symbol,price-sl*point),digits);
           }
         if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
           {
            //tp=NormalizeDouble(normalize(symbol,ask-tp*point),digits);
            //sl=NormalizeDouble(normalize(symbol,ask+sl*point),digits);
            tp=NormalizeDouble(normalize(symbol,price-tp*point),digits);
            sl=NormalizeDouble(normalize(symbol,price+sl*point),digits);
           }
         if(sl<0 || tp<0)return;
         trade.PositionModify(symbol,sl,tp);
        }
     }
  }
//+------------------------------------------------------------------+
void Trailing_Stop(string symbol,double sl)
  {
   double tp=0.0;
   if(sl<=0)return;

   double bid=SymbolInfoDouble(symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);
   int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS);

   if(bid<=0.0 || ask<=0.0)return;

   if(PositionSelect(symbol))
     {
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
        {
         tp=PositionGetDouble(POSITION_TP);
         sl=NormalizeDouble(normalize(symbol,bid-sl*point),digits);
         if(sl<=PositionGetDouble(POSITION_SL))return;
        }
      if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
        {
         tp=PositionGetDouble(POSITION_TP);
         sl=NormalizeDouble(normalize(symbol,ask+sl*point),digits);
         if(sl>=PositionGetDouble(POSITION_SL))return;
        }
      if(sl<0 || tp<0)return;
      trade.PositionModify(symbol,sl,tp);
     }
  }
//+------------------------------------------------------------------+
double Dynamic_Stop(string symbol,double k)
  {
   double atr[1];
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   double point=SymbolInfoDouble(symbol,SYMBOL_POINT);

   if(Bars(symbol,TF_ATR)<Period_ATR+1)return(WRONG_VALUE);

   if(m_atr==INVALID_HANDLE || m_atr==0)
     {
      m_atr=iATR(symbol,TF_ATR,Period_ATR);
      return(WRONG_VALUE);
     }

   if(CopyBuffer(m_atr,0,1,1,atr)<1)return(WRONG_VALUE);

   double vol=atr[0]/point*k;
   if(vol<=SymbolInfoInteger(symbol,SYMBOL_TRADE_STOPS_LEVEL))vol*=2.0;

//vol=NormalizeDouble(vol/ts,0)*ts;
   return(vol);
  }
//+------------------------------------------------------------------+
double normalize(string symbol,double value)
  {
   double ts=SymbolInfoDouble(symbol,SYMBOL_TRADE_TICK_SIZE);
   return(NormalizeDouble(value/ts,0)*ts);
  }
//+------------------------------------------------------------------+
Причина обращения: