ido370 Posted December 24, 2010 Report Share Posted December 24, 2010 (edited) Hello, currently i am using the KG GGH Signal indicator on Daily TF with MA 8 setting on EURUSD. I wanted to create an EA of this indicator but since i have never done this before, i don't get it working correctly like the indicator. Who can take a look at the files and convert it to an EA (maybe with iCustom) so that it takes all buy and sell orders when the arrows appear on the indicator? This is the code from the indicator: #property copyright "Copyright © 2007, Kang_Gun" #property link "" #property indicator_chart_window #property indicator_buffers 2 #property indicator_color1 Lime #property indicator_color2 Red extern bool Alert_ON = TRUE; extern int MA = 8; double g_ibuf_84[]; double g_ibuf_88[]; int gi_92 = 0; int gi_96 = 0; int init() { SetIndexStyle(0, DRAW_ARROW, EMPTY); SetIndexArrow(0, 233); SetIndexBuffer(0, g_ibuf_84); SetIndexStyle(1, DRAW_ARROW, EMPTY); SetIndexArrow(1, 234); SetIndexBuffer(1, g_ibuf_88); return (0); } int deinit() { return (0); } int start() { int li_8; double l_ima_20; double l_ima_28; double l_ima_36; double l_ima_44; double ld_52; double ld_60; double ld_unused_12 = 0; int li_68 = IndicatorCounted(); if (li_68 < 0) return (-1); if (li_68 > 0) li_68--; int li_0 = Bars - li_68; for (int li_4 = 1; li_4 <= li_0; li_4++) { li_8 = li_4; ld_52 = 0; ld_60 = 0; for (li_8 = li_4; li_8 <= li_4 + 9; li_8++) ld_60 += MathAbs(High[li_8] - Low[li_8]); ld_52 = ld_60 / 10.0; l_ima_20 = iMA(NULL, 0, MA, -1, MODE_LWMA, PRICE_TYPICAL, li_4); l_ima_36 = iMA(NULL, 0, MA, -1, MODE_LWMA, PRICE_TYPICAL, li_4 + 1); l_ima_28 = iMA(NULL, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, li_4); l_ima_44 = iMA(NULL, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, li_4 + 1); g_ibuf_84[li_4] = 0; g_ibuf_88[li_4] = 0; if (l_ima_20 > l_ima_28 && l_ima_36 < l_ima_44) { if (li_4 == 1 && gi_92 == FALSE) { gi_92 = TRUE; gi_96 = FALSE; if (Alert_ON) { Alert("BUY signal at Ask=", Ask, "\n Bid=", Bid, "\n Time=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()), "\n Symbol=", Symbol(), " Period=", Period()); } } g_ibuf_84[li_4] = Low[li_4] - ld_52 / 2.0; } else { if (l_ima_20 < l_ima_28 && l_ima_36 > l_ima_44) { if (li_4 == 1 && gi_96 == FALSE) { gi_96 = TRUE; gi_92 = FALSE; if (Alert_ON) { Alert("SELL signal at Ask=", Ask, "\n Bid=", Bid, "\n Date=", TimeToStr(TimeCurrent(), TIME_DATE), " ", TimeHour(TimeCurrent()), ":", TimeMinute(TimeCurrent()), "\n Symbol=", Symbol(), " Period=", Period()); } } g_ibuf_88[li_4] = High[li_4] + ld_52 / 2.0; } } } return (0); } An this is my first try for an EA, but its not working exactly the same somehow... : //+------------------------------------------------------------------+ //| KG GGH EA.mq4 | //| Copyright © 2007, Kang_Gun | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2007, Kang_Gun" #property link "" //+------------------------------------------------------------------+ //| Global Variables / Includes | //+------------------------------------------------------------------+ extern int MA = 8; double g_ibuf_84[]; double g_ibuf_88[]; int gi_92 = 0; int gi_96 = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- SetIndexStyle(0, DRAW_ARROW, EMPTY); SetIndexArrow(0, 233); SetIndexBuffer(0, g_ibuf_84); SetIndexStyle(1, DRAW_ARROW, EMPTY); SetIndexArrow(1, 234); SetIndexBuffer(1, g_ibuf_88); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int li_8; double l_ima_20; double l_ima_28; double l_ima_36; double l_ima_44; double ld_52; double ld_60; double ld_unused_12 = 0; int li_68 = Bars - 1; if (li_68 < 0) return (-1); if (li_68 > 0) li_68--; int li_0 = Bars - li_68; for (int li_4 = 1; li_4 <= li_0; li_4++) { li_8 = li_4; ld_52 = 0; ld_60 = 0; for (li_8 = li_4; li_8 <= li_4 + 9; li_8++) ld_60 += MathAbs(High[li_8] - Low[li_8]); ld_52 = ld_60 / 10.0; l_ima_20 = iMA(NULL, 0, MA, -1, MODE_LWMA, PRICE_TYPICAL, li_4); l_ima_36 = iMA(NULL, 0, MA, -1, MODE_LWMA, PRICE_TYPICAL, li_4 + 1); l_ima_28 = iMA(NULL, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, li_4); l_ima_44 = iMA(NULL, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, li_4 + 1); g_ibuf_84[li_4] = 0; g_ibuf_88[li_4] = 0; if (l_ima_20 > l_ima_28 && l_ima_36 < l_ima_44) { if (li_4 == 1 && gi_92 == FALSE) { gi_92 = TRUE; gi_96 = FALSE; // CLOSE ALL OPEN AND PENDING ORDERS int total = OrdersTotal(); for(int i=total-1;i>=0;i--) { OrderSelect(i, SELECT_BY_POS); int type = OrderType(); bool result = false; switch(type) { //Close opened long positions case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; //Close opened short positions case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; //Close pending orders case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } if(result == false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } } // END CLOSING ORDERS OrderSend("EURUSD",OP_BUY,0.1,Ask,10,NULL,NULL,NULL,5582,0,Blue); } g_ibuf_84[li_4] = Low[li_4] - ld_52 / 2.0; } else { if (l_ima_20 < l_ima_28 && l_ima_36 > l_ima_44) { if (li_4 == 1 && gi_96 == FALSE) { gi_96 = TRUE; gi_92 = FALSE; // CLOSE ALL OPEN AND PENDING ORDERS OrderSelect(i, SELECT_BY_POS); switch(type) { //Close opened long positions case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red ); break; //Close opened short positions case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red ); break; //Close pending orders case OP_BUYLIMIT : case OP_BUYSTOP : case OP_SELLLIMIT : case OP_SELLSTOP : result = OrderDelete( OrderTicket() ); } if(result == false) { Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() ); Sleep(3000); } } // END OF CLOSING ORDERS OrderSend("EURUSD",OP_SELL,0.1,Bid,10,NULL,NULL,NULL,5582,0,Blue); } g_ibuf_88[li_4] = High[li_4] + ld_52 / 2.0; } } } //---- return(0); //+------------------------------------------------------------------+ Edited December 24, 2010 by ido370 Quote Link to comment Share on other sites More sharing options...
San4x Posted December 24, 2010 Report Share Posted December 24, 2010 I think you should post this in the coding section. Moreover, you can't work with buffers in EAs. See MQL website: http://www.mql4.com/ Here's a simple solution. Use the MACD EA that's included default in MT4. Use iCustom() to call the indicator and get the signals. Set signal as variable. If signal ==0, then no trade. If signal==1, enter long, etc. Quote Thanks for the kudos...much appreciated! Link to comment Share on other sites More sharing options...
ido370 Posted December 24, 2010 Author Report Share Posted December 24, 2010 thanks for the quick post :) i will look into it, and will post back when its working! happy christmas Quote Link to comment Share on other sites More sharing options...
ido370 Posted December 25, 2010 Author Report Share Posted December 25, 2010 hmm seems that i dont have the default macd ea not anymore on my system. can you help me on my way how to set the signal as a variable and what icustom command i should use then? right now i have updated it, but its just not the same as the indicator... strange... //+------------------------------------------------------------------+ //| KG GGH EA.mq4 | //| Copyright © 2010, Kang_Gun | //| | //+------------------------------------------------------------------+ #property copyright "Copyright © 2010, Kang_Gun" #property link "" //+------------------------------------------------------------------+ //| Global Variables / Includes | //+------------------------------------------------------------------+ extern int MagicNumber = 5582; extern int MA = 8; extern double Lots = 0.1; double g_ibuf_84[]; double g_ibuf_88[]; int gi_92 = 0; int gi_96 = 0; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- SetIndexStyle(0, DRAW_ARROW, EMPTY); SetIndexArrow(0, 233); SetIndexBuffer(0, g_ibuf_84); SetIndexStyle(1, DRAW_ARROW, EMPTY); SetIndexArrow(1, 234); SetIndexBuffer(1, g_ibuf_88); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- int total = OrdersTotal(); int li_8; double l_ima_20; double l_ima_28; double l_ima_36; double l_ima_44; double ld_52; double ld_60; double ld_unused_12 = 0; int li_68 = Bars - 1; if (li_68 < 0) return (-1); if (li_68 > 0) li_68--; int li_0 = Bars - li_68; for (int li_4 = 1; li_4 <= li_0; li_4++) { li_8 = li_4; ld_52 = 0; ld_60 = 0; for (li_8 = li_4; li_8 <= li_4 + 9; li_8++) ld_60 += MathAbs(High[li_8] - Low[li_8]); ld_52 = ld_60 / 10.0; l_ima_20 = iMA(NULL, 0, MA, -1, MODE_LWMA, PRICE_TYPICAL, li_4); l_ima_36 = iMA(NULL, 0, MA, -1, MODE_LWMA, PRICE_TYPICAL, li_4 + 1); l_ima_28 = iMA(NULL, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, li_4); l_ima_44 = iMA(NULL, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, li_4 + 1); g_ibuf_84[li_4] = 0; g_ibuf_88[li_4] = 0; if (l_ima_20 > l_ima_28 && l_ima_36 < l_ima_44) { if (li_4 == 1 && gi_92 == FALSE) { gi_92 = TRUE; gi_96 = FALSE; OrderSelect(0,SELECT_BY_POS,MODE_TRADES); if ((total>0)&& OrderMagicNumber() == MagicNumber) { if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3); if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3); } OrderSend(Symbol(),OP_BUY,Lots,Ask,10,NULL,NULL,NULL,MagicNumber,0,Blue); } g_ibuf_84[li_4] = Low[li_4] - ld_52 / 2.0; } else { if (l_ima_20 < l_ima_28 && l_ima_36 > l_ima_44) { if (li_4 == 1 && gi_96 == FALSE) { gi_96 = TRUE; gi_92 = FALSE; OrderSelect(0,SELECT_BY_POS,MODE_TRADES); if ((total>0)&& OrderMagicNumber() == MagicNumber) { if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),3); if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),3); } OrderSend(Symbol(),OP_SELL,Lots,Bid,10,NULL,NULL,NULL,MagicNumber,0,Red); } } g_ibuf_88[li_4] = High[li_4] + ld_52 / 2.0; } } } //---- return(0); //+------------------------------------------------------------------+ Quote Link to comment Share on other sites More sharing options...
stovedude Posted December 25, 2010 Report Share Posted December 25, 2010 Try this one. I'm not sure what you actually named the indicator, but here is the indy with the same name the EA is using (or just change the name in the EA). http://www.4shared.com/file/0SKXCguG/KG_GGH_Signal.html Here are some of the settings that need explaining: UseClosedCandle = wait until candle is closed. MA - period from indicator. UseStdSL = fixed SL. UseSRStopLoss = set SL to previous fractal level. UseStdTP = fixed TP. UseStdBE = break even at x number of pips (see below). BreakEvenPips = how many pips after entry for BE LockInPips = how many pips to lock in profit after BE UseSRTrailStop = moves SL to previous fractal +/- SLPipDiff (plus spread if AddSpread = true) UseCandleTrail = moves SL to previous (defined by TrailCandlesBack) candle H/L +/- SLPipDiff (and spread). UseNewsFilter = news avoidance. MinsBeforeNews = how many minutes before news to stop trading. MinsAfterNews = how many minutes after news to stop trading. NewsImpact = 1-low , 2-medium , 3=high UseHourTrade1/2 = two different trading sessions can be used. Quote Link to comment Share on other sites More sharing options...
ido370 Posted December 25, 2010 Author Report Share Posted December 25, 2010 Try this one. I'm not sure what you actually named the indicator, but here is the indy with the same name the EA is using (or just change the name in the EA). http://www.4shared.com/file/0SKXCguG/KG_GGH_Signal.html Here are some of the settings that need explaining: UseClosedCandle = wait until candle is closed. MA - period from indicator. UseStdSL = fixed SL. UseSRStopLoss = set SL to previous fractal level. UseStdTP = fixed TP. UseStdBE = break even at x number of pips (see below). BreakEvenPips = how many pips after entry for BE LockInPips = how many pips to lock in profit after BE UseSRTrailStop = moves SL to previous fractal +/- SLPipDiff (plus spread if AddSpread = true) UseCandleTrail = moves SL to previous (defined by TrailCandlesBack) candle H/L +/- SLPipDiff (and spread). UseNewsFilter = news avoidance. MinsBeforeNews = how many minutes before news to stop trading. MinsAfterNews = how many minutes after news to stop trading. NewsImpact = 1-low , 2-medium , 3=high UseHourTrade1/2 = two different trading sessions can be used. thanks for your input, but when i want to backtest, i cannot change all settings (like MM to false). Why is that? And is it only trading when an arrow appears on the indicator? Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.