Просьба помочь найти ошибку!!!

 
При условии что if(a<b), где a=b выполнение функции должно пропускаться, на сколько я знаю. В моём же случае почемуто равенство между значениями СтопЛосса и МА пропускаються и начинает производиться модификация ордера. Естественно выдаёться ошибка 1:






Помогите найти в моём коде неправельность которая делает эту ошибку.


В низу сам код.
//+------------------------------------------------------------------+
//|                                                     dddddddd.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
 
double MA;int pos;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
MA=NormalizeDouble(iMA(NULL,PERIOD_H4,30,0,MODE_SMA,PRICE_CLOSE,1),Digits);
 
  if(OrderTotal(OP_SELL)==0)
    {
    OrderSend(Symbol(),OP_SELL,0.1,Bid,5,Bid+100*Point,0,NULL,0,0,CLR_NONE);
    }
    
    
  if(OrderTotal(OP_SELL)>0)
    {
    for(pos=OrdersTotal()-1;pos>=0;pos--)
      {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true)
        {
        if(OrderSymbol()==Symbol() && OrderType()==OP_SELL)
          {
        //----
          if(OrderStopLoss()>MA && MA-Ask>10*Point && MA<OrderOpenPrice())
            {
            Print(OrderStopLoss()>MA," (OrderStopLoss()",OrderStopLoss(),">MA",MA,") && ",
            MA-Ask>10*Point," && ",MA<OrderOpenPrice());
            OrderModify(OrderTicket(),OrderOpenPrice(),MA,0,0,CLR_NONE); 
            }
        //----
          }
        }
      else
        Print("Ошибка ",GetLastError());
      }
    }   
//----
   return(0);
  }
//+------------------------------------------------------------------+
int OrderTotal(int type)
  {
  int order=0;
  for(int pos=OrdersTotal()-1;pos>=0;pos--)
    {
    if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES)==true)
      {
      if(OrderSymbol()==Symbol() && OrderType()==type)
        {
        order++;             
        }
      }
    else
      Print("Ошибка ",GetLastError());
    }
  return(order);
  }
 
if(OrderStopLoss()>MA && MA-Ask>10*Point && MA<OrderOpenPrice())

поменяй на:

if((OrderStopLoss()-MA>0) && MA-Ask>10*Point && MA<OrderOpenPrice())

а еще лучше поменяй на:

if((OrderStopLoss()-MA>0) && (MA-Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0) && MA<OrderOpenPrice())
и сорри за лишние скобки, 1С попортил стиль:)
 
karakuts:


 
if(OrderStopLoss()-MA>0 && MA-Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0 && MA<OrderOpenPrice())
  {
  Print(OrderStopLoss()-MA>0," (OrderStopLoss()-MA ",OrderStopLoss()-MA,">0 ",0,") && ",
        MA-Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0," && ",MA<OrderOpenPrice());
  OrderModify(OrderTicket(),OrderOpenPrice(),MA,0,0,CLR_NONE); 
  }
:(
 
 
Попытался разобраться с вашей проблемой и заметил небольшую "особенность" функции Print.
Вот собственно скрипт:
int start()
  {
  double a=0.00001;
//----
   Print(a," > 0");
   if (a>0) Print("True"); else Print("False");
//----
   return(0);
  }
Вот собственно результат:

2007.10.02 13:54:04 Test USDCHF,H4: removed
2007.10.02 13:54:04 Test USDCHF,H4: True
2007.10.02 13:54:04 Test USDCHF,H4: 0 > 0
2007.10.02 13:54:04 Test USDCHF,H4: loaded successfully


После чего меняем в функции Print запятую на "конкатенацию строк", как показано ниже:
   Print(a + " > 0");
выполняем скрипт заново, и получаем весьма интересный результат:

2007.10.02 14:00:04 Test USDCHF,H4: removed
2007.10.02 14:00:04 Test USDCHF,H4: True
2007.10.02 14:00:04 Test USDCHF,H4: 0.00001000 > 0
2007.10.02 14:00:04 Test USDCHF,H4: loaded successfully

Вывод: проблемы с машинным округлением, так что вместо ">0" поставьте нечто вроде >0.00005, т.к. не думаю что после 4-го знака имеются значащие разряды.
if(OrderStopLoss()-MA>0.00005
 
conys:








Я в основном программирую на асме под дос... Можно про результат сравнения ноль??? (иходя из знаний программирования на машинном коде 1 и будет !!! )
 

Ето:

if(OrderStopLoss()>MA && MA-Ask>10*Point && MA<OrderOpenPrice())

сделай так и пролем с ошибка будет решится :

if(OrderStopLoss()>MA+Point && MA-Ask>10*Point && MA<OrderOpenPrice()

 
conys:
karakuts:


 
if(OrderStopLoss()-MA>0 && MA-Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0 && MA<OrderOpenPrice())
  {
  Print(OrderStopLoss()-MA>0," (OrderStopLoss()-MA ",OrderStopLoss()-MA,">0 ",0,") && ",
        MA-Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0," && ",MA<OrderOpenPrice());
  OrderModify(OrderTicket(),OrderOpenPrice(),MA,0,0,CLR_NONE); 
  }
:(

if(OrderStopLoss()-MA>Point && MA-Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0 && MA<OrderOpenPrice())

Попробуй так должно работать

Оп пока думал уже ответили

 
RacerATC:

Ето: 


if(OrderStopLoss()>MA && MA-Ask>10*Point && MA<OrderOpenPrice())


сделай так и пролем  с ошибка будет решится :


if(OrderStopLoss()>MA+Point && MA-Ask>10*Point && MA<OrderOpenPrice()


Большое спасибо, всё получилось, работает. Это я так понял новый "прикол" Build(а) 210, раньше такого не было, покрайней мере стоплосы двигались за скальзящими средними без всяких сообщений об ошибке.  И прибавление Point  к переменной типа double при сравнение OrderStopLoss() и iMA не требовалось :(
 
karakuts:
conys:

karakuts:

if(OrderStopLoss()-MA>Point && MA-Ask - MarketInfo(Symbol(),MODE_STOPLEVEL)*Point>0 && MA<OrderOpenPrice())

Попробуй так должно работать


Оп пока думал уже ответили


Тоже спасибо! Проблема уже решилась.
 

Проблема в том что OrderStopLoss() возвращает ненормализованное(!) значение. Сам на это натыкался.

А OrderStopLoss() > MA+Point не подходит, так как потом делается OrderModify(. ..,MA,...) и натыкаемся на ту же ошибку 1.

Либо приходится сдвигать стоп на лишний Point. Решило проблему

OrdSL = NormalizeDouble(OrderStopLoss(),Point);

if(OrdSL > MA)

....