Цены из ордеров нормализовать не обязательно - они (по идее) должны быть итак нормализованными.
В том то и дело, что по идее =) я билдов 5 - 10 назад писал в эксперте такую конструкцию - и заметил, что если не нормализовать, например, OrderStopLoss(), он _не_будет_равен_ нормализованному stoploss_level, хоть значения одинаковые...
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. Или опять что-то упустил?
Что-то как-то не логично работает 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, который является паскалеподобным. не надо руководствоваться описаниями одного языка при программировании на другом.
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. Или опять что-то упустил?
Еще одна неудачка
У вас оператор 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; }почитайте синтаксис команды 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 );можно назначать один раз - сразу после ордерселект, нет смысла в каждом кейсе писАть.
Господа разработчики.
Что-то как-то не логично работает switch. Вот выписка из описания MQL II:
"Последовательность инструкций выполняется до следующего 'case', 'default' или 'end'. Также последовательность инструкций может быть досрочно прервана оператором 'break'."
Это логично и соответствует аналогичным конструкциям других языков (я пользую Delphi). А в MQ4 получается, что последовательность инструкций выполняется от точки входа по CASE до закрытия switch или до break. Может так устроен C++, но, по моему, не логично.
"Последовательность инструкций выполняется до следующего 'case', 'default' или 'end'. Также последовательность инструкций может быть досрочно прервана оператором 'break'."
Это логично и соответствует аналогичным конструкциям других языков (я пользую Delphi). А в MQ4 получается, что последовательность инструкций выполняется от точки входа по CASE до закрытия switch или до break. Может так устроен C++, но, по моему, не логично.
именно так устроено в языке C. MQL4 - это си-подобный язык, в отличие от MQL II, который является паскалеподобным. не надо руководствоваться описаниями одного языка при программировании на другом.