Zero Divide (Нашли проблему - но почему?) - страница 3

 
double loss_for_1_lot = pips_to_bsl/ ts * tv ;

Это НЕ tv, которое приводит к div 0. Это может быть только ts. На 5-значном брокере ts может вывести ноль (4 цифры).

Мне кажется, что вы никогда не открывали эту пару, чтобы получить информацию о рынке от своего брокера, прежде чем загружать историю откуда-то еще.

 

Мне трудно поверить, что нулевое деление генерируется размещенным кодом.

DomGilberto скомпилируйте этот скрипт и прикрепите его к графику, который, по вашему мнению, возвращает нулевой размер тика.

int start()
  {
//----
   int i = Bars-1;
   int cnt;
   int tscnt = 0;
   int tvcnt = 0;
   double ts = MarketInfo(Symbol(), MODE_TICKSIZE);
   double tv = MarketInfo(Symbol(), MODE_TICKVALUE);
   while(i >=0)
   {if(ts < 0.00001) tscnt++;
    if(tv < 0.00001) tvcnt++;
    i--;
   }
   Alert("TickSize returned an erroneous value ",tscnt," times.");
   Alert("TickValue returned an erroneous value ",tvcnt," times.");
//----
   return(0);
  }
 
DomGilberto:

Я надеюсь, что это видео, которое я сделал (40 секунд или около того), иллюстрирует то, о чем я говорю (так как я не уверен, что объясняю понятно или нет).

Видео: http://screencast.com/t/uMHY5DpM

Вы увидите, что в первой части, когда я бросаю скрипт на живой график (реальный счет), значение тика и размер тика возвращают "0" на этом "условном счете", который я иллюстрирую в окне лотов (единиц).

Вторая часть - с тем же брокером, но на основе лота, и на этот раз он возвращает значение тика и размер тика. Опять же, я иллюстрирую, что вы торгуете, используя лоты.....

Что касается тестера стратегий, я понятия не имею, почему он работает, а иногда нет. Счет был подключен, пока я запускал обратные тесты (на демо условном счете (единицы)).

Мой следующий вопрос: если это типичный ответ, который я получаю от условного счета, можете ли вы предложить, как мне исправить расчет размера позиции в таких обстоятельствах? Он прекрасно работает для лотового фида... Надеюсь, это объясняет немного лучше?

Если вы используете другой код в вашем "тестовом" коде, то что это доказывает?

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

 

В вашем видео вы используете GBPUSD в первом случае, а затем GBPJPY во втором.

Я думаю, что если бы вы прикрепили свой скрипт к графику GBPUSD с нормальным лотом, вы бы получили значение tickvalue, но ticksize также был бы нулевым.

Это происходит потому, что в оповещениях вашего скрипта используются двойные значения, и поэтому 0.00001 будет выведено как 0.

Вместо этогоиспользуйте DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8).

 

Итак, во-первых, спасибо всем за помощь.

Вот видео для "Gumrai" и "SDC", подтверждающее то, что вы оба просите меня сделать. Я обозначил скрипты вашими псевдонимами MQL4, которые, очевидно, соответствуют вашему коду, который вы разместили здесь. Видео: http://screencast.com/t/kglCd2hCae

Брокер и соответствующий фид не были изменены во время паузы. Это тоже условный счет фида (единицы).

@RaptorUK: Да, я знал, что TICKVALUE возвращает текущее значение. Я думаю, что ваша вторая часть, глядя на это сейчас, вроде как логична. Я запутался, как я могу использовать tickvalue как часть моего условного счета, чтобы убедиться, что размер позиции правильный...?

 
DomGilberto:

Итак, во-первых, спасибо всем за помощь.

Вот видео для "Gumrai" и "SDC", подтверждающее то, что вы оба просите меня сделать. Я обозначил скрипты вашими псевдонимами MQL4, которые, очевидно, соответствуют вашему коду, который вы разместили здесь. Видео: http://screencast.com/t/kglCd2hCae

Брокер и соответствующий фид не были изменены во время паузы. Это тоже условный счет фида (единицы).

@RaptorUK: Да, я знал, что TICKVALUE возвращает текущее значение. Я думаю, что ваша вторая часть, глядя на это сейчас, вроде как логична. Я запутался в том, как я могу использовать tickvalue как часть моего условного фид-счета, чтобы убедиться, что размер позиции правильный...?


Эти видео - боль, они слишком большие для моего экрана.

Почему бы просто не опубликовать код скрипта и результат оповещения.

Я не знаю, что вы вставили в скрипт, который должен был быть моим предложенным кодом, но это никак не может привести к "08".

Используйте

Alert("TICKVALUE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),8));
Alert("TICKSIZE= ",DoubleToStr(MarketInfo(Symbol(),MODE_TICKSIZE),8));
 
DomGilberto:


@RaptorUK: Да, я знал, что TICKVALUE возвращает текущее значение сейчас. Я думаю, что ваша вторая часть, если смотреть на это сейчас, вроде как логична. Я запутался в том, как я могу использовать tickvalue как часть моего условного счета, чтобы убедиться, что размер позиции правильный...?

Сначала вы должны подтвердить, что TICKVALUE действительно возвращает нулевой результат, чего вы еще не сделали.
 
GumRai:


Эти видео - боль, они слишком большие для моего экрана.

Почему бы просто не опубликовать код скрипта и результат оповещения.

Я не знаю, что вы вставили в скрипт, который должен был быть моим предложенным кодом, но это никак не может привести к "08".

Используйте


Извините - теперь я понял, что забыл поставить "DoubleToStr", моя вина!!!

TickSize = 0.00100000

TickValue = 0.00001026

(Введено на условном фиде GBPJPY)

@SDC Я просто скопировал ваш код отсюда и поместил его в новый скрипт. Это то, что было возвращено.

 
Ок, новое обновление, я играл с ним, повторяя точное место, где происходит деление нуля.

В этой области кода я вывел формулу, чтобы разложить математику - Где это происходит, это на отложенном ордере BUY... но эта часть кода "pips_to_ssl" - это pips to SELL stop loss.... Который НЕ используется для отложенного ордера со стопом на покупку.....

double loss_for_1_lot1 = pips_to_ssl/  ts * tv  ;
   if( loss_for_1_lot1 == 0.0 )Print(" ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: ", pips_to_ssl,"/",ts,"*",tv);


2013.10.02 11:57:19     2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - loss_for_1_lot1 = 0.0 || The formula for this is: 0/0.001*0.0001

double pips_to_ssl=SellStopPrice-sellPrice;
   if(pips_to_ssl == 0)Print(" ERROR - pips_to_ssl = 0 || The formula for this is: ", SellStopPrice,"-",sellPrice); 

2013.10.02 12:08:01	2001.02.12 16:00  Trend Fishing - V1 - Notional Lots USDJPYnb,H1:  ERROR - pips_to_ssl = 0 || The formula for this is: 117.249-117.249

 
DomGilberto:
Ок, новое обновление, я поигрался с повторением точного места, где происходит деление на ноль.

В этой области моего кода я вывел формулу, чтобы разложить математику - Где это происходит, это на отложенном ордере на покупку... но эта часть кода "pips_to_ssl" - это пипсы для стоп-лосса на продажу.... Который НЕ используется для отложенного ордера со стопом на покупку.....



Я отсылаю вас к моему предыдущему сообщению

"Обратите внимание, что

double loss_for_1_lot = pips_to_bsl/ ts * tv ; //<<<<<<<<<<<<<<<<<<<<<<<<<<< This is giving me a "0" randomly sometimes?

также приведет к нулю, если pips_to_bsl равен нулю. Возможно ли это?"

bsl или ssl, та же кодировка.

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