2. Убедиться, что требуется переворот и поставить флаг переворота
3. Запомнить первоначальную позицию и поставить флаг наличия допереворотной позиции
4. Попытаться закрыть допереворотную позицию и в случае успеха снять флаг наличия допереворотной позиции.
5. Если открытой позиции нет и есть флаг переворота -попытаться открыть новую позицию, если позиция открылась - снять флаг переворота.
6. В случая сбоя выйти и на следующем тике заново пройти все шаги.
Это не совсем то что я хочу реализовать, уточняю.
В коде должно присутствовать только один модуль на открытие позиции (buy/sell), и только один модуль на закрытие позиции (buy/sell).
Переворот должен осуществляется посредством повторной итерации STARTa. Т.Е. при поступлении нового тика либо при формировании нового бара, в случаи тестирования, если первая итерация закрывает позу то вторая итерация открывает противоположную, т.к. флаг на закрытие buy есть флаг на открытие sell и наоборот.
int start() { int ticket; //---- //Print("Tick"); if (isNewBar()) { //Print("Bid=",DoubleToStr(Bid,8)); if (SignalExist(OP_BUY)&&AllowedOpenOrder(OP_BUY)) { if (OrdersTotalByType(OP_SELL)>0) CloseOrders(OP_SELL); GetOrder(OP_BUY); //Print("Buy"); } if (SignalExist(OP_SELL)&&AllowedOpenOrder(OP_SELL)) { if (OrdersTotalByType(OP_BUY)>0) CloseOrders(OP_BUY); GetOrder(OP_SELL); //Print("Sell"); } //ParabolTrailingStop(); TrailingStop(); } //EveryTick(); //---- return(0); }
Уточняю окончательоно.
AllowedOpenOrder()в простейшем виде просто проверяет наличии позиции в том же направлении , что и требует сигнал. В коде нет проверки на одновременное наличие двух противоположных сигналов (можно добавить), но у меня такой вариант тоже исключен.
Спасибо, как я понял у меня пробел по функциям не описанным в
справке MetaEditor (например isNewBar()), и мне непонятно почему они не подсвечиваются, а также необходимо
научиться использовать собственные функции.
Если можно, предоставите весь код, дабы на его примере ликвидировать
пробелы в знаниях и ответьте на вопрос почему isNewBar не подсвечивается
и отсутствует в справке.
//+------------------------------------------------------------------+ //| возвращает true если появлися новый бар, иначе false | //+------------------------------------------------------------------+ bool isNewBar() { //---- bool res=false; if (expertBars!=Bars) { expertBars=Bars; res=true; } //---- return(res); } //+------------------------------------------------------------------+ //| возвращает true, если появился сигнал на открытие ордера | //+------------------------------------------------------------------+ bool SignalExist(int _OrderType) { //---- bool res=false; //Print("Проверяем возможность открытия ",_OrderType); //---- return(res); } //+------------------------------------------------------------------+ //| возвращает тикет , при удачном открытиии ордера | //+------------------------------------------------------------------+ int GetOrder(int _OrderType) { //---- int ticket; double StopLoss,TakeProfit,indicator,range; string Comm; int MagicNumber; range=(Close[0]-Open[3])/Point;// вычислим движение за 3 последних бара в пунктах Comm=DoubleToStr(range,0); // запомним его с комментарии к ордеру // код открытия return(ticket); } //+------------------------------------------------------------------+ //| возвращает количество ордеров этого типа | //+------------------------------------------------------------------+ int OrdersTotalByType(int _OrderType) { //---- int res; for (int i=0;i<OrdersTotal();i++) { if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if (OrderType()!=_OrderType) continue; // не наш тип ордера // берем следующий res++; } } //---- return(res); } //+------------------------------------------------------------------+ //| закрывает все ордера указанного типа | //+------------------------------------------------------------------+ void CloseOrders(int _OrderType) { double ClosePrice; int ticket; bool res; //---- for (int cnt=OrdersTotal()-1;cnt>=0;cnt--) { if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) { if (OrderType()!=_OrderType) continue; RefreshRates(); if (_OrderType==OP_BUY) ClosePrice=NormalizeDouble(Bid,Digits); if (_OrderType==OP_SELL) ClosePrice=NormalizeDouble(Ask,Digits); ticket=OrderTicket(); res=OrderClose(ticket,OrderLots(),Slippage,Black); if (!res) Print("Не удалось закрыть ордер типа ",_OrderType); } } //---- return; } //+------------------------------------------------------------------+ //| возвращает true, если разрешается открыть ордер этого типа | //+------------------------------------------------------------------+ bool AllowedOpenOrder(int _OrderType) { //---- bool res=false; if (MaxOpenOrder<=0) res=true; else { res=(OrdersTotalByType(_OrderType)<MaxOpenOrder); } //---- return(res); } //+------------------------------------------------------------------+ //|подтягивает стоп на расстояние TS пунктов от текущей цены закрытия| //+------------------------------------------------------------------+ void TrailingStop() { int type,i; double NewStop; //---- // ваш код трейлинга //---- return; }
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
пробывал реализовать циклом не получилось.
реализовал идею по тупому, после проверки на закрытие, в случаи закрытия, OrderSend.
Но должен же быть более кроассивый метод, кто ведает, помогите алгоритмом.