Не могу понять почему данный советник открывает множество ордеров при сигнале индикаторов, я не программист но что-то пытался написать, так и не пойму в чем дело, погодите?
индюк может несколько раз давать сигналы на одном и том же месте взависимости от движения цены,
определяй время и не позволяй в одно и тоже время открывать ордера или ещё что придумай!
int total=OrdersTotal(); if(total<1) // Никакие открытые заказы(распоряжения) не выделили if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //---- покупаем -----------------------Возможно ошибка вот в этом месте.
После условия
if(total<1)попробуйте поставить фиг. скобку. " { "
И также дабавьте обратную скобку " }" перед строкой
//------------Закрытие позиций----------------------------------------
И сообщите сюда результат этих деяний.
годю!)
индюк может несколько раз давать сигналы на одном и том же месте взависимости от движения цены,
определяй время и не позволяй в одно и тоже время открывать ордера или ещё что придумай!
Логически я понимаю, что при сигналах двух индикаторов и есть условия открытия позиции, и это условие может сохраняться втечении некоторого временни, и врезультате изменения цены на один пункт или может бар, происходит открытие ордера и так далее пока сигнал не измениться, я не знаю как отрегулировать количество открываемых ордеров в начале сигнала, нужно чтото добавить или изменить.
2, поиск на верху в правом углу.
3. если так будете код выкладывать, мало кто будет смотреть... ( я не глядя дам ссыль, хз пойдёт нет) ссыль, ткнуть сюда
2, поиск на верху в правом углу.
3. если так будете код выкладывать, мало кто будет смотреть... ( я не глядя дам ссыль, хз пойдёт нет) ссыль, ткнуть сюда
2, поиск на верху в правом углу.
3. если так будете код выкладывать, мало кто будет смотреть... ( я не глядя дам ссыль, хз пойдёт нет) ссыль, ткнуть сюда
//+------------------------------------------------------------------+ //| Мой советник2.mq4 | //| Александр | //| | //+------------------------------------------------------------------+ #property copyright "Александр" #property link "" extern double Lots = 0.01; extern double MaximumRisk = 0.3; extern double TakeProfit = 30; extern double StopLoss = 350; extern double TrailingStop = 15; extern double TrailingStep = 20; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(Bars<100) { Print("bars less than 100"); return(0); } if(TakeProfit<10) { Print("TakeProfit less than 10"); return(0); } double S1,S2,St1,St2,fast1,fast2,slow1,slow2; int i, ticket; S2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_MAIN,0); St2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_SIGNAL,0); fast2=iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0); slow2=iMA(NULL,0,500,0,MODE_EMA,PRICE_OPEN,0); int total=OrdersTotal(); if(total<1) // Никакие открытые заказы(распоряжения) не выделили if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ", AccountFreeMargin()); return(0); } //---- покупаем ----------------------- if (fast2>slow2&&S2>St2) { ticket= OrderSend(Symbol(),OP_BUY,Lots,Ask,3, Bid - StopLoss*Point, Ask + TakeProfit*Point,"ОК",0,Blue); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие BUY order : ",OrderOpenPrice()); } return(0); } //---- продаем ------------------------ if (fast2<slow2&&S2<St2) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask + StopLoss*Point, Bid - TakeProfit*Point,"ОК",0,Red); if(ticket>0) { if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("произошло открытие SELL order : ", OrderOpenPrice()); } return(0); } //------------Закрытие позиций---------------------------------------- for(i=0; i<total; i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { if(OrderType()==OP_BUY) // long position is opened if(TrailingStop>0) if (Bid-OrderOpenPrice() > TrailingStop*Point) { if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue); } } } if (OrderType() == OP_SELL) { if (OrderOpenPrice()-Ask > TrailingStop*Point) { if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue); } } } return(0); } return(0); } //+-----------------------------------------------+
Самый простой способ такой.
В самый конец кода (вне функции СТАРТ) поставьте вот такую функцию.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж+ //| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru/ | //+----------------------------------------------------------------------------+ //| Версия : 19.02.2008 | //| Описание : Возвращает количество позиций. | //+----------------------------------------------------------------------------+ //| Параметры: | //| sy - наименование инструмента ("" - любой символ, | //| NULL - текущий символ) | //| op - операция (-1 - любая позиция) | //| mn - MagicNumber (-1 - любой магик) | //+----------------------------------------------------------------------------+ int NumberOfPositions(string sy="", int op=-1, int mn=-1) { int i, k=OrdersTotal(), kp=0; if (sy=="0") sy=Symbol(); for (i=0; i<k; i++) { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if (OrderSymbol()==sy || sy=="") { if (OrderType()==OP_BUY || OrderType()==OP_SELL) { if (op<0 || OrderType()==op) { if (mn<0 || OrderMagicNumber()==mn) kp++; }}}}} return(kp); }После чего, убираете из кода выражение
int total=OrdersTotal(); if(total<1)вместе с двумя фигурными скобками, кот. вы добавили.
Ну а далее просто. Используя эту функцию реализуете отдельно покупку и продажу.
if ( NumberOfPositions(NULL,OP_BUY, 0)<1) {//если нет открытых бай-позиций //---- покупаем ----------------------- ..... .... .... .... } //жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж if( NumberOfPositions(NULL,OP_SELL, 0)<1){//если нет открытых селл-позиций //---- продаем ------------------------ .... .... .............. .......... }
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Не могу понять почему данный советник открывает множество ордеров при сигнале индикаторов, я не программист но что-то пытался написать, так и не пойму в чем дело, как можно управлять количеством открываемых ордеров, помогите? И еще вопросс: TrailingStep это шаг перемещения безубыточности правильно ли он размещен в коде?
//+------------------------------------------------------------------+//| Мой советник2.mq4 |
//| Александр |
//| |
//+------------------------------------------------------------------+
#property copyright "Александр"
#property link ""
extern double Lots = 0.01;
extern double MaximumRisk = 0.3;
extern double TakeProfit = 30;
extern double StopLoss = 350;
extern double TrailingStop = 15;
extern double TrailingStep = 20;
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if(Bars<100)
{
Print("bars less than 100");
return(0);
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return(0);
}
double S1,S2,St1,St2,fast1,fast2,slow1,slow2;
int i, ticket;
S2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_MAIN,0);
St2=iStochastic(NULL,0,50,80,30,MODE_SMA,0,MODE_SIGNAL,0);
fast2=iMA(NULL,0,25,0,MODE_EMA,PRICE_OPEN,0);
slow2=iMA(NULL,0,500,0,MODE_EMA,PRICE_OPEN,0);
int total=OrdersTotal();
if(total<1)
// Никакие открытые заказы(распоряжения) не выделили
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ", AccountFreeMargin());
return(0);
}
//---- покупаем -----------------------
if (fast2>slow2&&S2>St2)
{
ticket= OrderSend(Symbol(),OP_BUY,Lots,Ask,3, Bid - StopLoss*Point,
Ask + TakeProfit*Point,"ОК",0,Blue);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("произошло открытие BUY order : ",OrderOpenPrice());
}
return(0);
}
//---- продаем ------------------------
if (fast2<slow2&&S2<St2)
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask + StopLoss*Point,
Bid - TakeProfit*Point,"ОК",0,Red);
if(ticket>0)
{
if(OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) Print("произошло открытие SELL order : ", OrderOpenPrice());
}
return(0);
}
//------------Закрытие позиций----------------------------------------
for(i=0; i<total; i++)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
if(OrderType()==OP_BUY) // long position is opened
if(TrailingStop>0)
if (Bid-OrderOpenPrice() > TrailingStop*Point)
{
if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL)
{
if (OrderOpenPrice()-Ask > TrailingStop*Point)
{
if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point || OrderStopLoss() == 0)
{
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point, OrderTakeProfit(), 0, Blue);
}
}
}
return(0);
}
return(0);
}
//+-----------------------------------------------+