|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Cannot set indicator buffers!
Habe versucht den T3MA in einem EA als custom indicator zu verwenden.
Bekomme beim Backtest die obige Meldung bezüglich indicator buffer: Hier der Code bis zur Orderaufgabe. #property copyright "xxx" #property link "" #property version "1.00" //#property strict extern bool Alarmset=true; //T3MA Alarm box int infoversand = 0; double upbuffer[500]; // array buffer for xup signal double dnbuffer[500]; // array buffer for xdwn signal int sep; extern int MaxOrdersProTag = 1 ; extern double Lots = 0.1; int aufgegebeneOrders = 0; int signal; int ticket; extern bool TrailingStoppNutzen = 1; extern int TrailStarten = 40; extern int TrailAbstand = 30; extern int Stopp = 80; extern int Kursziel = 70; extern int MagicNumber = 4526; extern double oben= 100; extern double unten= 99; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //indicators #property indicator_chart_window //T3MA Alarm SetIndexStyle(0,DRAW_ARROW,2); SetIndexArrow(0,233); //This is buy signal SetIndexBuffer(0, upbuffer); SetIndexStyle(1,DRAW_ARROW,2); SetIndexArrow(1,234); //This is short signal SetIndexBuffer(1,dnbuffer); if(Symbol()=="EURUSD"){sep=40;} //seperator space in points for arrow if(Symbol()=="USDCHF"){sep=30;} if(Symbol()=="USDJPY"){sep=30;} if(Symbol()=="GBPUSD"){sep=30;} if(Symbol()=="EURJPY"){sep=200;} if(Symbol()=="GBPJPY"){sep=120;} if(Symbol()=="AUDUSD"){sep=120;} if(Symbol()=="EUREX.FDX"){sep=2000;} if(Symbol()=="CME.ES"){sep=150;} return(0); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ // int counted_bars=IndicatorCounted(); double ax0[500]; double ax1[500]; double ax2[500]; int xdown,xup; for(int cnt=200;cnt>=0;cnt--) { ax0[cnt]=iCustom(NULL,0,"T3MA",4,1.5,cnt); //ax0,1,2 for determine turning point of T3MA ax1[cnt+1]=iCustom(NULL,0,"T3MA",4,1.5,cnt+1); ax2[cnt+2]=iCustom(NULL,0,"T3MA",4,1.5,cnt+2); if(ax0[cnt]-ax1[cnt+1]<0 && ax1[cnt+1]-ax2[cnt+2]>0){xdown=1;} else {xdown=0;} //definition for turning point if(ax0[cnt]-ax1[cnt+1]>0 && ax1[cnt+1]-ax2[cnt+2]<0){xup=1;} else {xup=0;} if(xdown==1){dnbuffer[cnt+1]=High[cnt+1]+(sep*Point);} //setting arrow down above High if(xup==1){upbuffer[cnt+1]=Low[cnt+1]-(sep*Point);} //setting arrow up below Low } // if(xup==1 && Alarmset && infoversand == 0){ Alert (Symbol()," ",Period()," STOCH-ALARM 3 >> BUY "); infoversand = 1; } if(xdown==1 && Alarmset && infoversand == 0){ Alert (Symbol()," ",Period()," STOCH-ALARM 3 >> SELL "); infoversand = 1; } double MomentumFilter = iMomentum(NULL,0,14,PRICE_CLOSE,1); //+------------------------------------------------------------------+ //| determine signal | //+------------------------------------------------------------------+ if (xup=1 && (MomentumFilter > oben)) { signal = 1; } if (xup=0 && (MomentumFilter < oben)) { signal = 0; } if (xdown=1 && (MomentumFilter < unten)){ signal = -1; } if (xdown=0 && (MomentumFilter > unten)){ signal = 0; } //+------------------------------------------------------------------+ //| placing orders | //+------------------------------------------------------------------+ if(signal == 1 && aufgegebeneOrders < MaxOrdersProTag && OrdersTotal() == 0){ ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,30,Ask - Stopp,Ask + Kursziel,"Trend Longorder",MagicNumber,0,Green); if(ticket>0)aufgegebeneOrders++; } etc. Kann mir jemand weiterhelfen? Bin noch ziemlich unerfahren, aber lernwillig. |
|
|||
Nun, ich denke in einem EA wird man keine Indikatorpuffer setzen können, weil man die in einem Indikator setzt.
Lösung: Lass einen Indikator einen Indikator sein und einen EA eine EA, d.h., dass was Du als Indikator in dem EA schreiben wolltest, packe es als einen separaten Indikator und rufe jegliche Indikatoren mittels iCustom() aus dem EA heraus auf. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Hallo Traderdoc,
wenn ich dich richtig verstanden habe, wäre es sinnvoller die Indikatorbeschreibung als Indikator abzuspeichern und mit icustom aufzurufen. Etwa so: upturn= icustom(NULL,0,name,input parameter,0,1); dwnturn= icustom(NULL,0,name,input parameter,1,1); Ich frage mich wie ich die turns aus der icustom Funktion auslesen kann. Ist upbuffer und downbuffer ausreichend? |
|
|||
Ja, genau.
Ich habe jetzt Deinen Code nicht so genau analysiert, aber die entscheidenden Indikatordaten werden ja immer in diesen Indikatorbuffers abgelegt. Und die können aus dem EA mittels iCustom() abgerufen werden. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Ist vermutlich doch komplizierter als ich zunächst dachte.
Habe folgendes probiert: i Custom(NULL,0,"T3MA-Alarm",Alarmset, infoversand, upbuffer, downbuffer) daraus: xup = i Custom(NULL,0,"T3MA-Alarm",1,0,1,0,1); xdwn=iCustom(NULL,0,"T3MA-Alarm",1,0,0,1,1); Das gibt zwar keine Fehlermeldung beim kompilieren, aber funktioniert nicht. Letztendlich würde so nur der upbuffer und downbuffer ausgelesen, aber eigentlich möchte ich ja die turns aus dem Code in Posting #1 auslesen und diese zur Signalgebung nutzen. Geht es denn überhaubt einen Indikator auszulesen, der selbst wiederum einen Indikator ausliest? |
|
|||
Zur Not würde ich dann Deinen Indikator in den des T3MA schreiben.
Der u.g. Code ist zu komplex, um jetzt auf die Schnelle eine optimale Lösung zu haben. Aber die Wege habe ich Dir aufgezeigt. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
Das hatte ich mir auch schon überlegt, aber der T3MA verwendet bereits 7 buffers und man müsste dann ja zwei buffer für upbuffer und downbuffer hinzufügen, was aber durch das buffer Limit nicht möglich ist.
Ich habe den EA mit einem iMA durchgeführt um zu überprüfen, ob er den prinzipiell funktioniert. Es werden nur short Signale erzeugt. Ich verstehe aber nicht warum dies der Fall ist. Hier nochmal der Code bis einschließlich Orderaufgabe. Vielleicht hat jemand eine Idee. void OnTick() { if(Hour() == 8 && Minute() == 0){ aufgegebeneOrders =0; } int xdown,xup: double ax1=iMA(NULL,0,13,8,MODE_EMA,PRICE_CLOSE,1); double ax2=iMA(NULL,0,13,8,MODE_EMA,PRICE_CLOSE,2); double ax3=iMA(NULL,0,13,8,MODE_EMA,PRICE_CLOSE,3); if(ax1-ax2<0 && ax2-ax3>0){xdown=1;} else {xdown=0;} if(ax1-ax2>0 && ax2-ax3<0){xup=1;} else {xup=0;} //+------------------------------------------------------------------+ //| determine signal | //+------------------------------------------------------------------+ if (xup == 1 ) { signal = 1; } if (xup == 0 ) { signal = 0; } if (xdown == 1){ signal = -1; } if (xdown == 0){ signal = 0; } //+------------------------------------------------------------------+ //| placing orders | //+------------------------------------------------------------------+ if(signal == 1 && aufgegebeneOrders < MaxOrdersProTag && OrdersTotal() == 0){ // prüfen ob bereits eine Order aufgegeben wurde ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,30,Ask - Stopp,Ask + Kursziel,"Trend Longorder",MagicNumber,0,Green); // Order aufgeben if(ticket>0)aufgegebeneOrders++; // Variable die die Anzahl der Orders enthält um eins hochzählen } if(signal == -1 && aufgegebeneOrders < MaxOrdersProTag && OrdersTotal() == 0){ // prüfen ob bereits eine Order aufgegeben wurde ticket = OrderSend(Symbol(),OP_SELL,Lots,Bid,30,Bid + Stopp,Bid - Kursziel,"Trend Shortorder",MagicNumber,0,Red); // Order aufgeben if(ticket>0)aufgegebeneOrders++; // Variable die die Anzahl der Orders enthält um eins hochzählen } |
|
|||
EA zeigt Divergenz Backtesting - Live Handel
Habe seit drei Tagen einen EA im Probehandel. Heute hätte der EA eine Sell Order auslösen sollen. Die Sell Order hätte dann kurz vor Börsenschluss wieder geschlossen werden sollen. Der EA hat aber nicht gehandelt. Im Strategietester habe ich den EA die letzten drei Tage back getestet. Dort wird die Position ordnungsgemäß eröffnet und geschlossen. Woran kann es liegen, dass der EA im Strategietester auf (Tickbasis) handelt nicht jedoch live im Demobetrieb? |
Lesezeichen |
Stichworte |
indicator buffers, indikator puffer, indikatorpuffer, mql4, programmierung, programmierung metatrader, puffer |
|
|