int start() { int total; if (OpenCondition) { total = OrdersTotal(); if (total > 0) { OrderSelect(total - 1, SELECT_BY_POS, MODE_TRADES); // последний открытый или модифицированный ордер будет последним в списке if (OrderOpenTime() < Time[0]) // Открыт раньше текущего бара? OrderSend(...); } }Если есть модификация ордеров или работает несколько стратегий, нужно искать самый поздний подходящий ордер в списке. Последний в списке может оказаться не им.
//+----------------------------------------------------------------------------+ //| Возвращает номер бара открытия последней позиции или -1. | //| Параметры: | //| sym - наименование инструмента ("" - текущий символ) | //| tf - таймфрейм ( 0 - текущий таймфрейм) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfBarOpenLastPos(string sym="", int tf=0, int op=-1, int mn=-1) { datetime oot; int i, k=OrdersTotal(); if (sym=="") sym=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sym) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) { if (oot<OrderOpenTime()) oot=OrderOpenTime(); } } } } } } return(iBarShift(sym, tf, oot, True)); }Пример использования:
if (NumberOfBarOpenLastPos()>0) { // Можно открывать позиции }
Всем спасибо, но я нашёл, как ещё проще сделать:
if (iBarShift("GBPUSD",0,OpenTime) != 0) { MyTicketBuy = OrderSend(Symbol(), OP_BUY, lot , Ask, 3, Bid - SL * Point, Ask+TP*Point, NULL, 0, 0, Green); OpenTime = iTime("GBPUSD",0,0); }
Мне всегда помогала такая строка в начале кода:
if(Volume[0]>1) return;
Implex:
Мне всегда помогала такая строка в начале кода:
Задача стояла не в полной остановке работы а в запрете на открытие
нового ордера.Мне всегда помогала такая строка в начале кода:
if(Volume[0]>1) return;
Это разные вещи.
Implex:
Мне всегда помогала такая строка в начале кода:
Мне всегда помогала такая строка в начале кода:
if(Volume[0]>1) return;
Я тоже долгое время пользовал этот оператор, пока опытным путем не установил, что иногда первое значение бара просто пропускается. Пришлось отказаться от этого оператора.:-(
komposter:
Самый правильный вариант предложил KimIV.
Corwin_Volot:
С Bars надо вообще осторожнее...А я еще проще :)
Самый правильный вариант предложил KimIV.
и в чем опасность? последствия?
в чем преимущество варианта KimIV?
Рискну присоединить и свой вариант. Сильно не пинать....
bool isNewBar=false; if (ExpertBars !=Bars) {ExpertBars=Bars; isNewBar=true; } if (isNewBar) //если появился новый бар : //------------------------------------------------------------ { int _Order=ExpertOrder(MagicGBPJPY); if (_Order!=0) ZeroBarOrd=true; //есть ордер паре GBPJPY else ZeroBarOrd=false; //нет ордера } if (!ZeroBarOrd) { ... ... ...
Это из моего мультивалютника. При этом подразумевается наличие функции ExpertOrder(Magic...);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
Полезная страничка получилась. В отличие от многих "новых тем". ...
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Мне нужно сделать так, что-бы после открытия одной сделки советник больше не открывал сделки в этом баре.