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)
-   -   EA setzt keine Trades ab (http://www.expert-advisor.com/forum/showthread.php?t=5837)

Gondiego 23.08.17 18:36

EA setzt keine Trades ab
 
Hallo zuammen,

ich habe (versucht) einen Indikator in einen EA zu wandeln, aber er setzt einfach keine Trades ab. Habe ich irgendwo einen grundelgeneden Fehler den ich übersehe?

Code:

#include <stdlib.mqh>

#property copyright
#property link      ""
#property version  "1.00"
#property strict
#property indicator_buffers 4
#property indicator_chart_window



extern double  Lot = 0.1;
extern double  TakeProfit = 0;
extern double  StopLoss = 0;
extern bool    AutomaticTrading = true;
extern bool    SendAlert = true;
extern bool    SendEmail = false;



int        AlertMinutesB4Close =x;
double  ExtHistoBuffer[];
double  ExtHistoBuffer2[];
double  BlueBar[],RedBar[];
double  nPips = x;



void SetLoopCount(int loops)
{
}

void SetIndexValue(int shift, double value)
{
  ExtHistoBuffer[shift] = value;
}

void SetIndexValue2(int shift, double value)
{
  ExtHistoBuffer2[shift] = value;
}

//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int init()
  {
 
     
  return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
int deinit()
  {
//---
  return(0);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
int start()
  {
        int shift = 0;
        double cnt = 0;
        double TrStopLevel = 0;
        double PREV = 0;
        double pass = 0;
       
        SetLoopCount(0);
        // loop from first bar to current bar (with shift=0)
       
        for( shift=Bars-2; shift>=0 ;shift--)
        {
            if( (Close[shift] == PREV) )         
              {
                  TrStopLevel=PREV;
              }           
            else
            {
              if( (Close[shift+1])<PREV && (Close[shift]<PREV)  )             
                  {
                    TrStopLevel=MathMin(PREV,Close[shift]*(1+nPips));
                  }             
              else 
              {
                  if( (Close[shift+1])>PREV && (Close[shift]>PREV) )                 
                    {
                        TrStopLevel=MathMax(PREV,Close[shift]*(1-nPips));
                    }             
                  else               
                  {
                    if( (Close[shift]>PREV) )                       
                        {                 
                          TrStopLevel=Close[shift]*(1-nPips);
                        }               
                    else                   
                        {
                          TrStopLevel=Close[shift]*(1+nPips);
                        }
                  }
              }
            }
                       
            if( Close[shift] > TrStopLevel &&  Close[shift+1]<PREV && PREV !=0 )
           
            {             
                  if(AutomaticTrading)                 
                    {
                        OrderSend(OP_BUY,Lot,MarketInfo(Symbol(), MODE_ASK),2,StopLoss,Ask-TakeProfit*Point,Lime);
                    }               
                  if(SendAlert)
                    {
                        Alert(Symbol() + " - Look for Buying opportunity soon");
                    }               
                  if(SendEmail)               
                    {
                        SendMail("Possible Buy setup on " + Symbol(),"Text");
                    }                   
                  RedBar[shift]=Low[shift];
                  BlueBar[shift]=High[shift];
                  SetIndexValue(shift, TrStopLevel);                         
            }
                       
            if( Close[shift] < TrStopLevel &&  Close[shift+1]>PREV  && PREV !=0)
            {
                  if(AutomaticTrading)               
                    {
                        OrderSend(OP_SELL,Lot,MarketInfo(Symbol(), MODE_BID),2,StopLoss,Bid-TakeProfit*Point,Red);
                    }               
                  if(SendAlert)               
                    {
                        Alert(Symbol() + "Text");
                    }                 
                  if(SendEmail)               
                    {
                        SendMail("Text","Text");
                    }       
                  BlueBar[shift]=Low[shift];
                  RedBar[shift]=High[shift];
                  SetIndexValue2(shift, TrStopLevel);                             
            }                       
            PREV=TrStopLevel;           
        }
       
  return(0);
 
  }
//+------------------------------------------------------------------+

Wäre um jede Hilfe dankebar.

Gruß Gondiego

traderdoc 23.08.17 19:03

Ohne den Code vollständig seziert zu haben, fallen diese beiden Zeilen auf, da stimmt so einiges nicht:

OrderSend(OP_BUY,Lot,MarketInfo(Symbol(), MODE_ASK),2,StopLoss,Ask-TakeProfit*Point,Lime);

OrderSend(OP_SELL,Lot,MarketInfo(Symbol(), MODE_BID),2,StopLoss,Bid-TakeProfit*Point,Red);

1. keine Angabe des Symbols
2. bei StopLoss müsste der Kurs des StopLoss angegeben werden, was ich bezweifle, da diese Variable so in den Eigenschaften geschrieben steht
3. beim TakeProfit der BuyOrder würde der TP unter!! dem Open der Order liegen - das geht natürlich gar nicht.

Besser wäre es, sich an die Vorgabe der Dokumentation zu halten:

int OrderSend(
string symbol, // symbol
int cmd, // operation
double volume, // volume
double price, // price
int slippage, // slippage
double stoploss, // stop loss
double takeprofit, // take profit
string comment=NULL, // comment
int magic=0, // magic number
datetime expiration=0, // pending order expiration
color arrow_color=clrNONE // color
);

traderdoc

Gondiego 23.08.17 19:59

Liste der Anhänge anzeigen (Anzahl: 1)
Hallo traderdoc,

danke für deine Antwort. Ja, das sind dann so Sachen, die sieht man nicht mehr wenn man zu lange davor sitzt. ;)

Aber....auch durch ändern der Zeilen tut sich nichts...selbst wenn ich sie ohne Verweise schreibe.

OrderSend(Symbol(),OP_BUY,0.1,MarketInfo(Symbol(), MODE_ASK),2,0,0,NULL,0,0,Green);

OrderSend(Symbol(),OP_SELL,0.1,MarketInfo(Symbol() , MODE_BID),2,0,0,NULL,0,0,Red);


Ich habe einfach mal den ursprünglichen Indikator mitangehangen, vielleicht hilft das.

Gondiego

traderdoc 23.08.17 21:33

OK, dann muss jetzt jemand ran, der viel Zeit hat, um den Fehler zu finden.

traderdoc

next user 24.08.17 00:03

*Hust...

Hab auch mal kurz einen Blick auf deinen Code im 1 Post geworfen:

Code:

#property copyright
Da fehlt der Wert.

Code:

int        AlertMinutesB4Close =x;
...
double  nPips = x;

X ist nirgendwo definiert.

Code:

void SetLoopCount(int loops)
{
}

Leere Funktion, die du aber weiter unten mit dem Wert "0" aufrufst.

Code:

for(shift=Bars-2; shift>=0 ;shift--)
{
  if(Close[shift] == PREV)         
      TrStopLevel=PREV;
  else
  {
      if((Close[shift+1])<PREV && (Close[shift]<PREV))             
        TrStopLevel=MathMin(PREV,Close[shift]*(1+nPips));           
      else 
      {
        if((Close[shift+1])>PREV && (Close[shift]>PREV))
            TrStopLevel=MathMax(PREV,Close[shift]*(1-nPips));

        else               
        {
            if(Close[shift]>PREV)
              TrStopLevel=Close[shift]*(1-nPips);
            else                   
              TrStopLevel=Close[shift]*(1+nPips);
        }
      }
  }

Im ersten Durchlauf der Schleife ist die Variable "PREV" 0. Der Code geht also an der blau hervorgehobenen Stelle weiter.
Dort hast du aber einen Fehler (rot hervorgehoben), denn "nPips" initialisierst du oben mit der nicht vorhandenen Variable "x", somit
wird die Variable "TrStopLevel" auch nicht "optimal" belegt.


Zitat:

Zitat von Gondiego (Beitrag 39651)
ich habe (versucht) einen Indikator in einen EA zu wandeln...

  • Fehler 1:
    Code:

    #property indicator_buffers 4
    #property indicator_chart_window

    ===>>> Gehört nicht in einen EA.
  • Fehler 2:
    Code:

    ...
    double  ExtHistoBuffer[];
    double  ExtHistoBuffer2[];
    double  BlueBar[],RedBar[];
    ...

    ===>>> In einem EA sind das einfach nur dynamische Arrays, OHNE Bindung zu einem "Indicator-Buffer" und somit auch OHNE "automatischer Größenverwaltung".
    Zu diesem Zeitpunkt haben diese Arrays keine wirkliche größe.
  • Fehler 3:
    Code:

    void SetIndexValue(int shift, double value)
    {
      ExtHistoBuffer[shift] = value;
    }

    void SetIndexValue2(int shift, double value)
    {
      ExtHistoBuffer2[shift] = value;
    }

    ===>>> 1. Diese beiden "Buffer" sind, wie gerade schon erwähnt normale, dynamische Arrays, momentan ohne Größe.
    Den Index "shift" gibt es somit nicht.
    ===>>> 2. Hier würdest du einfach nur einen Wert in das Array setzen. Dieses Array ist jedoch nicht an einen Indikator-Buffer gebunden.
    Diese Arrays werden also nicht "automatisch" für irgendetwas genutzt.
  • Fehler 4:
    Code:

    BlueBar[shift]=Low[shift];
    RedBar[shift]=High[shift];
    SetIndexValue2(shift, TrStopLevel);

    ===>>> Auch hier setzt du lediglich Werte in ein dynamisches Array, welches zu diesem Zeitpunkt noch nichtmal eine Größe hat.
    Der Index "shift" ist also auch hier nicht existent.


Ich frag mich auch grad, ob du beim Compilieren überhaupt keine Errors und Warnungen erhalten hast... ?

Jetzt aber schlafen...

traderdoc 24.08.17 06:15

Na siehst Du, @Gondiego, hat sich doch schon jemand gefunden, der einfach zu viel Zeit hat.

traderdoc

next user 24.08.17 06:36

Zitat:

Zitat von traderdoc (Beitrag 39656)
...der einfach zu viel Zeit hat.

Stimmt. Wenn ihr meinen Namen unter den "Onlineusern" mal nicht seht, das ist ein Bug den Master noch nicht behoben hat.
Bin 24/7 präsent...

Spaß bei Seite, mein Post waren die letzten Minuten vorm Schlafen gehen. Da hab ich die mal schnell noch sinnvoll genutzt.

Gondiego 27.08.17 15:11

Hallo,

erstmal vielen Danke @next user für deine Mühe.

Code:

#property copyright

int        AlertMinutesB4Close =x;
...
double  nPips = x;

Das mit den x ist mir schon bewusst, das habe ich einfache weggelassen. Sollte ja darum gehen, ob es grundlegende Fehler im Aufbau gibt - was du ja letztendlich festgestellt hast. ;)

Aber dafür stecke ich einfach zu wenig in der Materie :(

Kann mir denn jetzt jemand sagen, was ich tun muss, damit er als EA einfach nur eine Order, bei Auftreten der Pfeile, absetzt?
(Vielleicht hilft ja der Ursprungscode des Indis, welchen ich mit angehangen habe)

Wenns garnicht anders geht, bin ich auch bereit, das auf Honorarbasis machen zu lassen. (wenns nicht zu teuer wird ;-P )

Gondiego

next user 27.08.17 17:06

Zitat:

Zitat von Gondiego (Beitrag 39668)
...das auf Honorarbasis machen zu lassen. (wenns nicht zu teuer wird ;-P )

Hey Doc, biste da :D

traderdoc 27.08.17 18:47

Der @doc ist da, steckt aber zu tief in anderen Aufträgen.
Übernimm Du mal.

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 21:14 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