Если Вы хотите заказать советник или индикатор, то публикуйте в эту группу тех. задание. Если Ваш заказ не очень сложный, то велика вероятность, что Вам его смогут сделать даже бесплатно
Программистам MQL: подпишитесь на группу, чтобы получать уведомления о заказах.
сов не должен выставлять новые ордера если уже есть указанное количество ордеров (рыночных).
Например: указанное количество ордеров — 5 (5 на бай, 5 на бай), при достижении указанного количества ордеров сов не должен выставлять новые отложеные ордера, а дожидается когда соотношение открытых оредров будет как минимум 4/4
Редактирован: 10 мая 2021, 18:43
В первом варианте ограничение 5 на бай и 5 на селл. Можно кол-во указать в настройках. Во втором варианте ограничение на общее кол-во ордеров, как из указанного Вами топика.
Комментарии (15)
<code>//+------------------------------------------------------------------+ //| Monson3.mq4 | //| Copyright 2021, AM2 | //| http://www.forexsystems.biz | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, AM2" #property link "http://www.forexsystems.biz" #property version "1.00" #property strict //--- Inputs extern double Lots = 0.1; // лот extern double Profit = 0; // язь в рублях extern int StopLoss = 0; // лось extern int TakeProfit = 0; // язь extern int Delta = 111; // пункты от цены extern int TrailingStop = 111; // трал extern int TrailingStep = 20; // шаг трала extern int CountOrd =5; // кол-во однонаправленных ордеров extern int Slip = 30; // реквот extern int Magic = 0; // магик int trades=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,Lots,NormalizeDouble(price,_Digits),Slip,sl,tp,"",Magic,0,clr); return; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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); } //+------------------------------------------------------------------+ //| Ступенчатый трал if(TrailingStop>0) Trailing(); | //+------------------------------------------------------------------+ void Trailing() { bool mod; 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) { if(Bid-OrderOpenPrice()>TrailingStop*_Point) { if(OrderStopLoss()<Bid-(TrailingStop+TrailingStep-1)*_Point) { mod=OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*_Point,OrderTakeProfit(),0,Yellow); return; } } } if(OrderType()==OP_SELL) { if((OrderOpenPrice()-Ask)>TrailingStop*_Point) { if(OrderStopLoss()>Ask+(TrailingStop+TrailingStep-1)*_Point || OrderStopLoss()==0) { mod=OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*_Point,OrderTakeProfit(),0,Yellow); return; } } } } } } } //+------------------------------------------------------------------+ //| Подсчет ордеров по типу | //+------------------------------------------------------------------+ int CountOrders(int type=-1) { 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 || type==-1) count++; } } } return(count); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CloseAll(int ot=-1) { bool cl; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==0 && (ot==0 || ot==-1)) { RefreshRates(); cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White); } if(OrderType()==1 && (ot==1 || ot==-1)) { RefreshRates(); cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White); } } } } } //+------------------------------------------------------------------+ //| Профит всех ордеров по типу ордера | //+------------------------------------------------------------------+ double AllProfit(int ot=-1) { double pr=0; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()==0 && (ot==0 || ot==-1)) { pr+=OrderProfit()+OrderCommission()+OrderSwap(); } if(OrderType()==1 && (ot==1 || ot==-1)) { pr+=OrderProfit()+OrderCommission()+OrderSwap(); } } } } return(pr); } //+------------------------------------------------------------------+ //| Удаление отложенных ордеров | //+------------------------------------------------------------------+ void DelOrder() { bool del; for(int i=OrdersTotal()-1; i>=0; i--) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) { if(OrderType()>1) del=OrderDelete(OrderTicket()); } } } } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(TrailingStop>0) Trailing(); if(CountOrders()<1) DelOrder(); if(Profit>0 && AllProfit()>Profit) CloseAll(); if((trades!=CountOrders()) || (CountOrders()<1)) { DelOrder(); if(CountTrades()<CountOrd*2) { if(CountOrders(4)<CountOrd) { PutOrder(4,Bid+Delta*_Point); } if(CountOrders(5)<CountOrd) { PutOrder(5,Bid-Delta*_Point); } } trades=CountOrders(); } Comment("\n Trades: ",CountTrades(), "\n Profit: ",AllProfit(), "\n Buy Profit: ",AllProfit(0), "\n Sell Profit: ",AllProfit(1)); } //+------------------------------------------------------------------+ </code>Редактирован: 10 мая 2021, 20:1915 verta81 Сообщений: 489
15 verta81 Сообщений: 489
Например: указанное количество ордеров — 5 (5 на бай, 5 на бай), при достижении указанного количества ордеров сов не должен выставлять новые отложеные ордера, а дожидается когда соотношение открытых оредров будет как минимум 4/4 Редактирован: 10 мая 2021, 18:43
8 guardian4 Автор Сообщений: 83 - guardian4
15 verta81 Сообщений: 489
указал макс кол-во ордеров — 5 (в суме 10) Редактирован: 10 мая 2021, 19:10
8 guardian4 Автор Сообщений: 83 - guardian4
15 verta81 Сообщений: 489
8 guardian4 Автор Сообщений: 83 - guardian4
Все работает. Не один ордер Редактирован: 10 мая 2021, 20:54
15 verta81 Сообщений: 489
35 AM2 Сообщений: 16672 - Андрей
16 ssg Сообщений: 817
Последняя проба)) и ждем вариант Андрея.
www.opentraders.ru/downloads/3006/
Грааль))) Редактирован: 11 мая 2021, 17:14
15 verta81 Сообщений: 489
Редактирован: 12 мая 2021, 00:10
10 Skyrider60 Сообщений: 93
15 verta81 Сообщений: 489
www.opentraders.ru/downloads/2993/
35 AM2 Сообщений: 16672 - Андрей
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий