- нужна помощь для создания советника или скрипта.
- Покупка советника
- Universal MA Cross EA
Здравствуйте, у меня обычный MACD simple только со стопом (спасибо Natalya Dzerzhinskaya), но столкнулся с проблемой, вернее сказать с двумя, у этого советника нет в настройках параметра "magic" и по какой-то причине "take profit" свыше 100 пунктов (по четырехзнаку) не устанавливается. Прошу помочь кто разбирается в MQL и если не в тягость.
в Вашем случае или к Natalya Dzerzhinskaya (она уже видела Ваш код) - кстати, знаете что можно в личку?
или выкладывайте свой код для всеобщего обозрения - но как на это посмотрит Natalya Dzerzhinskaya???
в Вашем случае или к Natalya Dzerzhinskaya (она уже видела Ваш код) - кстати, знаете что можно в личку?
или выкладывайте свой код для всеобщего обозрения - но как на это посмотрит Natalya Dzerzhinskaya???
Выложен .
Выложен .
//+------------------------------------------------------------------+ //| MACD Sample.mq4 | //| Copyright 2005-2014, MetaQuotes Software Corp. | //| http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright "2005-2014, MetaQuotes Software Corp." #property link "http://www.mql4.com" input int MagicNumber =16384; input string __ ="---===---"; input double Lots =0.1; input int StopLoss =50; input int TakeProfit =50; input int TrailingStop =30; input string ___ ="---===---"; input int MACDOpenLevel =3; input int MACDCloseLevel=2; input string ____ ="---===---"; input int InpFastEMA =12; // Fast EMA Period input int InpSlowEMA =26; // Slow EMA Period input int InpSignalSMA =9; // Signal SMA Period input string _____ ="---===---"; input int MATrendPeriod =26; int Stoplevel; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnTick(void) { double MacdCurrent,MacdPrevious; double SignalCurrent,SignalPrevious; double MaCurrent,MaPrevious; int cnt,ticket,total; double OSL,OOP,SL; int i,OT,OTicket; Stoplevel=MarketInfo(Symbol(),MODE_STOPLEVEL); for (i=0; i<OrdersTotal(); i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) { OT = OrderType(); OSL = NormalizeDouble(OrderStopLoss(),Digits); OOP = NormalizeDouble(OrderOpenPrice(),Digits); SL=OSL; if (OT==OP_BUY) { if (OSL==0 && StopLoss>=Stoplevel && StopLoss!=0){ SL = NormalizeDouble(Bid - StopLoss * Point,Digits); } else SL=OSL; if (SL != OSL){ OTicket=OrderTicket(); if (!OrderModify(OTicket,OOP,SL,OrderTakeProfit(),0,White)) Print("Error OrderModify ",GetLastError()); } } if (OT==OP_SELL) { if (OSL==0 && StopLoss>=Stoplevel && StopLoss!=0){ SL = NormalizeDouble(Ask + StopLoss * Point,Digits); } else SL=OSL; if (SL != OSL || OSL==0){ OTicket=OrderTicket(); if (!OrderModify(OTicket,OOP,SL,OrderTakeProfit(),0,White)) Print("Error OrderModify ",GetLastError()); } } } //--- // initial data checks // it is important to make sure that the expert works with a normal // chart and the user did not make any mistakes setting external // variables (Lots, StopLoss, TakeProfit, // TrailingStop) in our case, we check TakeProfit // on a chart of less than 100 bars //--- if(Bars<100) { Print("bars less than 100"); return; } if(TakeProfit<10) { Print("TakeProfit less than 10"); return; } //--- to simplify the coding and speed up access data are put into internal variables MacdCurrent=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_MAIN,0); MacdPrevious=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_MAIN,1); SignalCurrent=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_SIGNAL,0); SignalPrevious=iMACD(NULL,0,InpFastEMA,InpSlowEMA,InpSignalSMA,PRICE_CLOSE,MODE_SIGNAL,1); MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0); MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1); total=OrdersTotal(); if(total<1) { //--- no opened orders identified if(AccountFreeMargin()<(1000*Lots)) { Print("We have no money. Free Margin = ",AccountFreeMargin()); return; } //--- check for long position (BUY) possibility if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDOpenLevel*Point) && MaCurrent>MaPrevious) { ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",MagicNumber,0,Green); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice()); } else Print("Error opening BUY order : ",GetLastError()); return; } //--- check for short position (SELL) possibility if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDOpenLevel*Point) && MaCurrent<MaPrevious) { ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",MagicNumber,0,Red); if(ticket>0) { if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice()); } else Print("Error opening SELL order : ",GetLastError()); } //--- exit from the "no opened orders" block return; } //--- it is important to enter the market correctly, but it is more important to exit it correctly... for(cnt=0;cnt<total;cnt++) { if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES)) continue; if(OrderType()<=OP_SELL && // check for opened position OrderSymbol()==Symbol()) // check for symbol { //--- long position is opened if(OrderType()==OP_BUY) { //--- should it be closed? if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious && MacdCurrent>(MACDCloseLevel*Point)) { //--- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)) Print("OrderClose error ",GetLastError()); return; } //--- check for trailing stop if(TrailingStop>0) { if(Bid-OrderOpenPrice()>Point*TrailingStop) { if(OrderStopLoss()<Bid-Point*TrailingStop) { //--- modify order and exit if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green)) Print("OrderModify error ",GetLastError()); return; } } } } else // go to short position { //--- should it be closed? if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious && MathAbs(MacdCurrent)>(MACDCloseLevel*Point)) { //--- close order and exit if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)) Print("OrderClose error ",GetLastError()); return; } //--- check for trailing stop if(TrailingStop>0) { if((OrderOpenPrice()-Ask)>(Point*TrailingStop)) { if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0)) { //--- modify order and exit if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red)) Print("OrderModify error ",GetLastError()); return; } } } } } } //--- } //+------------------------------------------------------------------+
Изменяемый MagicNumber, переведены некоторые вводные на int. Так-же добавлены входные параметры
input int InpFastEMA =12; // Fast EMA Period input int InpSlowEMA =26; // Slow EMA Period input int InpSignalSMA =9; // Signal SMA Period
для настройки самого MACD. С ними оно поудобней будет
Создайте параметр в настройках Magic=16384 и в коде вместо 16384 обращайтесь к этому параметру
Спасибо вам за отклик на мою просьбу, но мои познания в MQL настолько ничтожны, что я не осилю ваши рекомендации.
Спасибо вам за отклик на мою просьбу, но мои познания в MQL настолько ничтожны, что я не осилю ваши рекомендации.
И уж добавление параметра ....
OrderModify(OTicket,OOP,SL,0,0,White)
Получился прибыльный советник. Отчет за 3 месяца 2017 года утраивает
Параметры | Mag=16384; Lots=0.17; StopLoss=50; TakeProfit=50; Tral=25; MACDOpn=2; MACDClos=5; FastEMA=12; SlowEMA=26; SignalSMA=9; MAPeriod=24; MinTrend=1; Начало=9; Конец=22; | ||||
Баров в истории | 93870 | Смоделировано тиков | 7005203 | Качество моделирования | 25.00% |
Ошибки рассогласования графиков | 0 | ||||
Начальный депозит | 200.00 | Спред | 2 | ||
Чистая прибыль | 405.28 | Общая прибыль | 1987.64 | Общий убыток | -1582.36 |
Даже не обратил внимание. Магик вставил, посмотрел какие вводные множатся на Point, их на int перевел, ну и вводные на сам MACD добавил, остальное оставил как есть.
P.S. Сейчас исправил запрос старого TP ордера.
Ну ты даешь! Уже второй шедевр выкладываешь!!! На маркет скоро выложишь?
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования