MQ4 - страница 2

 
double orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits );
double orderstoploss = NormalizeDouble ( OrderStopLoss(), digits );

Цены из ордеров нормализовать не обязательно - они (по идее) должны быть итак нормализованными.

2Василий: помещайте, пожалуйста, код в тег [ pre ] - иначе читать просто невозможно.
 
Цены из ордеров нормализовать не обязательно - они (по идее) должны быть итак нормализованными.

В том то и дело, что по идее =) я билдов 5 - 10 назад писал в эксперте такую конструкцию - и заметил, что если не нормализовать, например, OrderStopLoss(), он _не_будет_равен_ нормализованному stoploss_level, хоть значения одинаковые...
 
Всем спасибо, все случилось.
Особое спасибо komposter.
 
Еще одна неудачка

totalBuy=OP_BUY //это код выше присваивает
 switch (totalBuy)
    { case -1:
         {if (Ask>=HC1) 
            {OrderSend(Symbol(),OP_BUY,Lots,Ask,3,LC1,0,"Ask>=HC1",16384,0,CLR_NONE);
            break;}
         if (HC1-Ask>spr)  
            {OrderSend(Symbol(),OP_BUYSTOP,Lots,HC1,3,LC1,0,"HC1-Ask>spr",16384,0,CLR_NONE); 
            break;}}
      case OP_BUY:
         {OrderSelect(ordtikBuy, SELECT_BY_TICKET, MODE_TRADES);
         orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits );
         orderstoploss = NormalizeDouble ( OrderStopLoss(), digits );
         if (orderstoploss <LC1 && LC1>orderopenprice) 
            {OrderModify(OrderTicket(),OrderOpenPrice(),LC1,OrderTakeProfit(),0,CLR_NONE);
            break;}
         if (orderstoploss ==0) 
            { OrderModify(OrderTicket(),OrderOpenPrice(),LC1,OrderTakeProfit(),0,CLR_NONE);
            break;}}
      case OP_BUYSTOP:
         {OrderSelect(ordtikBuy, SELECT_BY_TICKET, MODE_TRADES);
         orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits );
         orderstoploss = NormalizeDouble ( OrderStopLoss(), digits );
         if (orderstoploss!=LC1 || orderopenprice!=HC1) 
            {OrderModify(OrderTicket(),HC1,LC1,OrderTakeProfit(),0,CLR_NONE);
            break;}}
     }  



totalBuy равен OP_BUY , т.е 0. В блоке case OP_BUY: по условиям не пролазиим и соответсвенно изменений не делаем. А вот в блоке case OP_BUYSTOP: срабатывание происходит. Ведь этот блок должен игнарироваться.
OP_BUYSTOP=4. Или опять что-то упустил?

 
Василий 24.03.05 16:20

Еще одна неудачка


У вас оператор break; срабатывает только в случае модификации ордера. Его надо вынести из скобок:
case OP_BUY:
{
         OrderSelect(ordtikBuy, SELECT_BY_TICKET, MODE_TRADES);
         orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits );
         orderstoploss = NormalizeDouble ( OrderStopLoss(), digits );
         if (orderstoploss <LC1 && LC1>orderopenprice) 
            {OrderModify(OrderTicket(),OrderOpenPrice(),LC1,OrderTakeProfit(),0,CLR_NONE); }
         if (orderstoploss ==0) 
            { OrderModify(OrderTicket(),OrderOpenPrice(),LC1,OrderTakeProfit(),0,CLR_NONE); }
break;
}
 
А почему он вообще пролазиит в блок OP_BUYSTOP ведь totalBuy равен OP_BUY, а не OP_BUYSTOP?
 
А почему он вообще пролазиит в блок OP_BUYSTOP ведь totalBuy равен OP_BUY, а не OP_BUYSTOP?

почитайте синтаксис команды switch....
там хороший пример:
switch(x)
     {
      case 'A':
         Print("CASE A\n");
         break;
      case 'B':
      case 'C':
         Print("CASE B or C\n");
		 break;
      default:
         Print("NOT A, B or C\n");
         break;
     }


посмотрите case B u C



зы:

         orderopenprice = NormalizeDouble ( OrderOpenPrice(), digits );
         orderstoploss = NormalizeDouble ( OrderStopLoss(), digits );


можно назначать один раз - сразу после ордерселект, нет смысла в каждом кейсе писАть.

 
Спасибо komposter.

Господа разработчики.

Что-то как-то не логично работает switch. Вот выписка из описания MQL II:
"Последовательность инструкций выполняется до следующего 'case', 'default' или 'end'. Также последовательность инструкций может быть досрочно прервана оператором 'break'."
Это логично и соответствует аналогичным конструкциям других языков (я пользую Delphi). А в MQ4 получается, что последовательность инструкций выполняется от точки входа по CASE до закрытия switch или до break. Может так устроен C++, но, по моему, не логично.
 
Что-то как-то не логично работает switch. Вот выписка из описания MQL II:
"Последовательность инструкций выполняется до следующего 'case', 'default' или 'end'. Также последовательность инструкций может быть досрочно прервана оператором 'break'."
Это логично и соответствует аналогичным конструкциям других языков (я пользую Delphi). А в MQ4 получается, что последовательность инструкций выполняется от точки входа по CASE до закрытия switch или до break. Может так устроен C++, но, по моему, не логично.

именно так устроено в языке C. MQL4 - это си-подобный язык, в отличие от MQL II, который является паскалеподобным. не надо руководствоваться описаниями одного языка при программировании на другом.