Уважаемые программисты!
На днях по моей просьбе был написан советник: zakaz.opentraders.ru/62861.html. Работа выполнена
идеально, но к сожалению стратегия не так прекрасна, как хотелось бы. В связи с чем прошу внести небольшие корректировки /сам не смог, вроде бы не сложно, как не пытался ничего не получается/. Вместо SellStop и BuyStop устанавливать BuyLimit и SellLimit, И вместо StopLoss тралить ордера по TakeProfit.
Вдвоём, я думаю, советникам будет работать веселее.
В счет следующего месяца, если есть такая возможность
⟨Внимание! Одно из основных условий — заказы принимаются в бесплатную работу только с 3-го уровня и не более 1 заказа в месяц.⟩
Спасибо!
Комментарии (9)
<code>//+------------------------------------------------------------------+ //| ProBoy.mq4 | //| Copyright 2021, AM2 | //| <a href="https://www.forexsystems.biz">www.forexsystems.biz</a> | //+------------------------------------------------------------------+ #property copyright «Copyright 2021, AM2» #property link «<a href="https://www.forexsystems.biz">www.forexsystems.biz</a>» #property version «1.00» #property strict //--- Inputs extern double Lots = 0.1; // лот extern double KLot = 2; // умножение лота extern double MaxLot = 5; // лот для вирта extern int StopLoss = 0; // лось extern int TakeProfit = 1000; // язь extern int Candles = 20; // свечей в коробке extern int CandleTrail = 10; // свечей для трала extern int Delta = 0; // расстояние от цены extern int Slip = 30; // реквот extern int Magic = 123; // магик extern bool BuyStop = true; // BuyStop extern bool SellStop = true; // SellStop datetime t=0; double hi=0,lo=0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Comment(""); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void PutOrder(int type,double price) { int r=0; color clr=Green; double sl=0,tp=0; if(type==1 || type==3 || type==5) { clr=Red; if(StopLoss>0) { sl=NormalizeDouble(price+StopLoss*_Point,_Digits); } if(TakeProfit>0) { tp=NormalizeDouble(price-TakeProfit*_Point,_Digits); } } if(type==0 || type==2 || type==4) { clr=Blue; if(StopLoss>0) { sl=NormalizeDouble(price-StopLoss*_Point,_Digits); } if(TakeProfit>0) { tp=NormalizeDouble(price+TakeProfit*_Point,_Digits); } } r=OrderSend(NULL,type,Lot(),NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ double Lot() { double lot=Lots; for(int i=OrdersHistoryTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) { if(OrderProfit()>0) break; if(OrderProfit()<0) { lot=OrderLots()*KLot; break; } } } if(lot>MaxLot) lot=Lots; return(lot); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CountTrades() { int count=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()<2) count++; } } } return(count); } //+------------------------------------------------------------------+ //| Подсчет ордеров по типу | //+------------------------------------------------------------------+ int CountOrders(int type) { int count=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==type) count++; } } } return(count); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void ModeOOP() { bool m=1; double sl=0,tp=0; lo=Low[iLowest(NULL,0,1,Candles,0)]; hi=High[iHighest(NULL,0,2,Candles,0)]; double opb=NormalizeDouble(hi+Delta*_Point,_Digits); double slb=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)]-Delta*_Point,_Digits); double ops=NormalizeDouble(lo-Delta*_Point,_Digits); double sls=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)]+Delta*_Point,_Digits); for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUYSTOP)//4 { if(OrderOpenPrice()!=opb) { if(TakeProfit>0) { tp=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits); } if(StopLoss>0) { slb=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits); } m=OrderModify(OrderTicket(),opb,slb,tp,0,Blue); return; } } if(OrderType()==OP_SELLSTOP)//5 { if(OrderOpenPrice()!=ops) { if(TakeProfit>0) { tp=NormalizeDouble(OrderOpenPrice()-TakeProfit*_Point,_Digits); } if(StopLoss>0) { sls=NormalizeDouble(OrderOpenPrice()+TakeProfit*_Point,_Digits); } m=OrderModify(OrderTicket(),ops,sls,tp,0,Blue); return; } } } } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CandleTrailing() { bool mod=1; double sl=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==OP_BUY) { sl=NormalizeDouble(Low[iLowest(NULL,0,1,CandleTrail,1)]-Delta*_Point,_Digits); if(Bid>sl) { if(OrderStopLoss()<sl || OrderStopLoss()==0) { if(OrderStopLoss()!=sl) mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow); return; } } } if(OrderType()==OP_SELL) { sl=NormalizeDouble(High[iHighest(NULL,0,2,CandleTrail,1)]+Delta*_Point,_Digits); if(Ask<sl) { if(OrderStopLoss()>sl || OrderStopLoss()==0) { if(OrderStopLoss()!=sl) mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,Yellow); return; } } } } } } } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(t!=Time[0]) { lo=Low[iLowest(NULL,0,1,Candles,0)]; hi=High[iHighest(NULL,0,2,Candles,0)]; ModeOOP(); if(CandleTrail>0) CandleTrailing(); if(CountTrades()<1) { if(BuyStop && CountOrders(4)<1) { PutOrder(4,hi+Delta*_Point); } if(SellStop && CountOrders(5)<1) { PutOrder(5,lo-Delta*_Point); } } t=Time[0]; } Comment("\n Lot: ",Lot()); } //+------------------------------------------------------------------+</code>Редактирован: 14 ноября 2021, 20:1316 M-mason Автор Сообщений: 99 - Михаил
15 verta81 Сообщений: 489
нужно чтобы эта функция работала не для StopLoss, а для TakeProfit.
16 M-mason Автор Сообщений: 99 - Михаил
StopLoss не тралится, или фиксированный — это длительная просадка в ожидании лося или профита.
Может для лимитников лучше входить на экстремумах за 10 свечей и тралить стоп по экстремумам за 20 свечей, к примеру.
15 verta81 Сообщений: 489
16 M-mason Автор Сообщений: 99 - Михаил
15 verta81 Сообщений: 489
16 M-mason Автор Сообщений: 99 - Михаил
35 AM2 Сообщений: 16663 - Андрей
16 M-mason Автор Сообщений: 99 - Михаил
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий