Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
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, который является паскалеподобным. не надо руководствоваться описаниями одного языка при программировании на другом.