Проблема с Zero divide - страница 2

 
Roger:

Код сам по себе очень сырой и еще долго не будет работать.

Что это - if(STOPLEVEL<NormalizeDouble(tpbuy,0)) ?

Почему проскальзывание нулевое?


Что б Take Profit был больше минимального. Округление до целых.
 
oyshen:

Что б Take Profit был больше минимального. Округление до целых.


tpbuy=NormalizeDouble((High[1]-Open[1]),4)*NormalizeDouble(kbuy,2);

Это в районе ста пунктов, т.е. ~0.01. В Вашем случае округление даст 0. 

 
Roger:


tpbuy=NormalizeDouble((High[1]-Open[1]),4)*NormalizeDouble(kbuy,2);

Это в районе ста пунктов, т.е. ~0.01. В Вашем случае округление даст 0.


Понял ход мыслей, ошибку признаю, буду исправляться
 
Проблему с Zero divide решил, но сделки не открываются, посмотрите своим свежим взглядом.
extern int   CloseHour     = 23;      // Время закрытия, часы
extern int   CloseMinute   = 1;      // Время закрытия, минуты
extern color clClose    = Yellow;   // 
extern double Lot = 0.1;
int TP;
int ExpertBars;
int init()
{
ExpertBars = Bars;
return(0);
}
int start()
  {
  bool isNewBar=false;
if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true;}
if (isNewBar) {
  if(DayOfWeek()>1&&DayOfWeek()<6)
   {
                                                          if(OrdersTotal()<1){
   double STOPLEVEL;
                       //Buy
   if(Close[1]>Open[1]){
   //Расчет TP
   TP=NormalizeDouble(High[1]-Open[1]*10000,4);
   STOPLEVEL=MarketInfo("GBPUSD",MODE_STOPLEVEL);
   if(STOPLEVEL<TP){
   OrderSend(Symbol(),OP_BUY,Lot,NormalizeDouble(Ask,4),0,0,Ask+TP*Point,"",0,0,Blue );}}
   if(Open[1]>Close[1]){
  //Расчет TP
   TP=NormalizeDouble(Close[1]-Low[1]*10000,4);
   STOPLEVEL=MarketInfo("GBPUSD",MODE_STOPLEVEL);
   if(STOPLEVEL<TP){
   OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,4),0,0,Bid-TP*Point,"",0,0,Red );}}
                                                                            }
   double pBid, pAsk;
   if(Hour()==CloseHour && Minute()>=CloseMinute) {
    for (int i=OrdersTotal()-1; i>=0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
       
          if (OrderType()==OP_BUY) {
            pBid=MarketInfo(OrderSymbol(), MODE_BID);
            OrderClose(OrderTicket(), OrderLots(), pBid, 0, clClose);
          }
          if (OrderType()==OP_SELL) {
            pAsk=MarketInfo(OrderSymbol(), MODE_ASK);
            OrderClose(OrderTicket(), OrderLots(), pAsk, 0, clClose);
          }
        }
      
    }
  }
  }}
   return(0);
  }
 
Вы уверены что данная конструкция соответствует тому что Вы закладывали в неё?:
  TP=NormalizeDouble(High[1]-Open[1]*10000,4);

Может быть задумано было так?:

  TP=NormalizeDouble((High[1]-Open[1])*10000,4);

Я бы ещё заменил цифру 4 на Digits в OrderSend() т.к. ДЦ бывают и с 5-знаком:

 OrderSend(Symbol(),OP_SELL,Lot,NormalizeDouble(Bid,Digits),0,0,Bid-TP*Point,"",0,0,Red );


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

 
goldtrader:
Вы уверены что данная конструкция соответствует тому что Вы закладывали в неё?:

Может быть задумано было так?:

Я бы ещё заменил цифру 4 на Digits в OrderSend() т.к. ДЦ бывают и с 5-знаком:


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


Спасибо, проблема решена.
 
Vladon:

мне кажется выражение:

не совсем правильное

ибо в МКЛ4 выражение 0 и 0.0 и 0.0000 абсолютно разные :-) при проверке некоторых индикаторах я пришел к такому выводу.


Candid:

Неправильным выражение можно назвать только тогда, когда оно не обеспечивает нужный результат. В данном случае страховку от ошибки zero divide То есть я думаю, что оно правильное.

Другая сторона - насколько оно оптимально. У нас здесь res имеет тип double. Я предполагаю, что при сравненни с 0 (тип int) сначала будет сделано приведение типов, то есть 0 будет превращён в 0.0 . То есть сравнивая double с int вы неявно закладываете в код лишнюю операцию. Впрочем это лишь моё предположение. Не желаете проверить?

Куда ж товарищ пропал-то, сейчас же тема закроется :). Неужели его истина совсем не интересует? :)

На самом деле по скорости счёта вариант сравнения переменной double с константой типа int совершенно эквивалентен сравнению с константой типа double, я полагаю что это заслуга компилятора, делающего преобразование типов на этапе компиляции. Убедиться в эквивалентности можно с помощью простейшего скрипта

#property show_inputs

extern int N = 100000000;
//+------------------------------------------------------------------+
//| script                                                           |
//+------------------------------------------------------------------+
int start() {
  double A = 100;
  int T1 = GetTickCount();
  for (int i=0;i<N;i++) {
     A = A;
  }
  int T2 = GetTickCount();
  Print("Точка 0: ",T2-T1);

  T1 = GetTickCount();
  for (i=0;i<N;i++) {
     if (A > 0.0) A = A;
  }
  T2 = GetTickCount();
  Print("Точка 1: ",T2-T1);

  T1 = GetTickCount();
  for (i=0;i<N;i++) {
     if (A > 0) A = A;
  }
  T2 = GetTickCount();
  Print("Точка 2: ",T2-T1);

  return (0);
}


Но я хотел бы получить ещё какие-то свидетельства в пользу действительного нетривиального утверждения, что, цитирую, в МКЛ4 выражение ... 0.0 и 0.0000 абсолютно разные

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