Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Cannot set indicator buffers! (http://www.expert-advisor.com/forum/showthread.php?t=4675)

carnap 08.01.16 19:58

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?:confused: Bin noch ziemlich unerfahren, aber lernwillig.:)

traderdoc 08.01.16 22:16

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

carnap 08.01.16 23:15

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?

traderdoc 08.01.16 23:27

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

carnap 09.01.16 19:34

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?

traderdoc 09.01.16 20:34

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

carnap 10.01.16 13:57

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
}

carnap 16.01.16 00:23

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?

Crashbulle 16.01.16 14:37

Das ist doch ganz einfach zu beantworten.

Im Strategietester werden die hinterlegten Tickdaten genommen, mit deinem voreingestellten SPREAD,

während im Demo, die annährend realen Daten mit dem jeweils aktuellen SPREAD verarbeitet werden.

Die nächste Ungläubigkeit wird dir dann noch im Live (Real) bevorstehen !

carnap 16.01.16 22:24

Am Spread kann es nicht liegen sowohl im Tester als auch im EA ist er auf 30 eingestellt.
Daran kann es also eigentlich nicht liegen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:46 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum