Сразу 2 проблемы в 2-х терминалах - страница 4

 
cloud666:
if(OrderType()==0)
{
   if((slu)>PP)
   {
      PP=slu;
   }

}

Так работает, а так нет:
if(OrderType()==0 && slu>PP)
{
   PP=slu;

}

И что про терминал под смарты??? (длинна пароля, индикаторы)


Давно заметил, что операция && имеет самый большой приоритет, поэтому порядок выполнения получается следующий:

1. Выполняется (0 && slu) при этом sly преобразуется к bool

2. Сравнивается OrderType() == (0 && slu)

3. Проверяется (OrderType() == (0 && slu)) > PP результат совершенно неопределенный

Поэтому принял за правило все сравнения заключать в скобки, а уж потом выполнять && или ||

Правильное написание условия

if((OrderType() == 0) && (slu > PP))
 
2007.08.09 12:05:51 2006.10.18 10:47 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: OrderModify error 1
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: OrderModify error 1
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: OrderModify error 1
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: OrderModify error 1
2007.08.09 12:05:50 2006.10.17 15:25 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:46 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:46 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:46 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:45 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:45 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:45 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:45 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:49 2006.10.16 16:45 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:52 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:52 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:52 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:52 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:52 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:51 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:51 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605
2007.08.09 12:05:48 2006.10.13 11:51 cloud's trade 3 GBPUSD,Daily: Alert: 1.8395 1.8585 1.8605

Вот лог с такой вставкой в код:
Alert(OrderStopLoss(),"  ",sd,"  ",su);
 
cloud666:
Этот код должен работать только когда стоп не равен ни одному из значений!!! А он выдает ордер модифи еррор! В чем причина???
         if((OrderStopLoss()!=su) && (OrderStopLoss()!=sd))
         {
            if((OrderType()==0)
             && (PP>=Point*ProfitPoints)
              && (OrderStopLoss()<OrderOpenPrice()))
            {
               OrderModify(OrderTicket(), 0, su, 0, 0, 0);
            }
            if((OrderType()==1)
             && (PP>=Point*ProfitPoints)
              && (OrderStopLoss()>OrderOpenPrice()))
            {
               OrderModify(OrderTicket(), 0, sd, 0, 0, 0);
            }
         }


А надо так. Нету нулевых цен открытия

  OrderModify(OrderTicket(), OrderOpenPrice(), su, 0, 0, 0);
 
  OrderModify(OrderTicket(), OrderOpenPrice(), sd, 0, 0, 0);
 
PSmith:
cloud666:
Этот код должен работать только когда стоп не равен ни одному из значений!!! А он выдает ордер модифи еррор! В чем причина???
         if((OrderStopLoss()!=su) && (OrderStopLoss()!=sd))
         {
            if((OrderType()==0)
             && (PP>=Point*ProfitPoints)
              && (OrderStopLoss()<OrderOpenPrice()))
            {
               OrderModify(OrderTicket(), 0, su, 0, 0, 0);
            }
            if((OrderType()==1)
             && (PP>=Point*ProfitPoints)
              && (OrderStopLoss()>OrderOpenPrice()))
            {
               OrderModify(OrderTicket(), 0, sd, 0, 0, 0);
            }
         }



А надо так.  Нету нулевых цен открытия

  OrderModify(OrderTicket(), OrderOpenPrice(), su, 0, 0, 0);
 
  OrderModify(OrderTicket(), OrderOpenPrice(), sd, 0, 0, 0);

Не помогло :(, мож ручки кривые у разработчиков???
 
Вот код, где ошибка? Какого из условий не хватает для проверки стоп-лосса???
      if(ProfitPoints!=0)
      {
         slu=Bid-OrderOpenPrice();
         b=Bid;
         sld=OrderOpenPrice()-Ask;
         a=Ask;
         if((OrderType()==0) && (slu>PP))
         {
            PP=slu;
         }
         if((OrderType()==1) && (sld>PP))
         {
            PP=sld;
         }
         su=OrderOpenPrice()+(Point*MinProfit);
         sd=OrderOpenPrice()-(Point*MinProfit);
         Alert(OrderStopLoss(),"  ",sd,"  ",su);
         if((OrderStopLoss()!=su) && (OrderStopLoss()!=sd))
         {
            if((OrderType()==0)
             && (PP>=Point*ProfitPoints)
              && (OrderStopLoss()<OrderOpenPrice()))
            {
               OrderModify(OrderTicket(), OrderOpenPrice(), su, 0, 0, 0);
            }
            if((OrderType()==1)
             && (PP>=Point*ProfitPoints)
              && (OrderStopLoss()>OrderOpenPrice()))
            {
               OrderModify(OrderTicket(), OrderOpenPrice(), sd, 0, 0, 0);
            }
         }
      }
 
Ошибка тут имхо:
'OrderStopLoss() возвращает ненормализованное значение - это нормально?'
У меня по крайней мере было так (пытался ставиться тот же стоплосс, что и был)... то есть это условие работает некорректно:
(OrderStopLoss()!=su) && (OrderStopLoss()!=sd)
попробуй нормальзовать значения вот так:
NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(su,Digits)
 && NormalizeDouble(OrderStopLoss(),Digits)!=NormalizeDouble(sd,Digits)
 

su < (Bid - MarketInfo(Symbol(),0,MODE_STOPLEVEL)*Point)

sd > (Ask + MarketInfo(Symbol(),0,MODE_STOPLEVEL)*Point)

 
stringo:
cloud666:
В терминале 208 билд: условия типа if(a>b && b>c || c<d){} срабатывают когда выполняется первое условие!!!
Расставляйте скобки, чтобы не было "казнить нельзя помиловать". Или почитайте про приоритеты операций

А что, математика уже вне закона?

У меня аналогичные вопросы по приоритетам:
'Булевые операции и приоритеты'

Буду рад развернутым комментариям разработчиков.
 
PSmith:

su < (Bid - MarketInfo(Symbol(),0,MODE_STOPLEVEL)*Point)


sd > (Ask + MarketInfo(Symbol(),0,MODE_STOPLEVEL)*Point)



Да это понятно! Почему так условия срабатывают???
 
ARray:
stringo:
cloud666:
В терминале 208 билд: условия типа if(a>b && b>c || c<d){} срабатывают когда выполняется первое условие!!!
Расставляйте скобки, чтобы не было "казнить нельзя помиловать". Или почитайте про приоритеты операций

А что, математика уже вне закона?

У меня аналогичные вопросы по приоритетам:
'Булевые операции и приоритеты'

Буду рад развернутым комментариям разработчиков.


Если скобки не стоят, то первой операцией всегда выполняется &&, которая имеет наивысший приритет (на практике проверено неоднократно).

1. b && b = int(b) - целая часть b

2. с || с = int(c) - целая часть c

3. a > int(b) = 1/0

4. 1/0 > int(c) = 1/0

5. 1/0 < d = ?

А поскольку разницы между bool и int практически никакой нет то результат может быть любой. Ставьте скобки и будет вам щастье.