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)
-   -   Heiken Ashi (http://www.expert-advisor.com/forum/showthread.php?t=6144)

FX4Life 22.06.18 23:19

Heiken Ashi
 
Hallo Leute,

ich habe mir vor kurzem das Programmieren beigebracht. Sehr spannendes Thema :D Aber ich stehe noch ziemlich am Anfang und brauch mal eure Hilfe.

Ich würde gerne den Heiken Ashi Smoothed Indikator in einen EA einbauen. Ich habe mich eingelesen, google gefragt und auch Videos angesehen, aber irgendwie bekomme ich es einfach nicht hin.

Es scheitert bereits beim eingebauten HA....
Wenn ich den in mein EA einbauen will, muss ich das doch über den iCustom machen und die Bufferwerte auslesen, was in etwa so lauten müsste:
Code:

double HA_Open, HA_Close;

HA_Open=iCustom(NULL,0,"Heiken Ashi",2,1);
HA_Close=iCustom(NULL,0,"Heiken Ashi",3,1);

if(HA_Close>HA_Open)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-sl*Point,Ask+tp*Point,NULL,0,0,clrGreen);
}

Aber wie mache ich das beim HA_Smoothed und wo finde ich da den Buffer??

MA-EA 23.06.18 08:25

Versuch vielleicht mal mode.

traderdoc 23.06.18 15:28

Zitat:

Zitat von MA-EA (Beitrag 41135)
Versuch vielleicht mal mode.

??????? Was Du aber auch so immer schreibst!

Da gibt es mehrere Buffer, 4 (0 bis 3) sind davon relevant und am wichtigsten die Buffer 0 und 1, die ausreichen, um eine blaue von einer roten Kerze zu unterscheiden.

traderdoc

MA-EA 23.06.18 21:27

Liste der Anhänge anzeigen (Anzahl: 1)
Kann man die nicht mit Mode einbaun/auslesen was auch immer? :confused:

Code:

haOpen=(ExtOpenBuffer[i-1]+ExtCloseBuffer[i-1])/2;
haClose=(open[i]+high[i]+low[i]+close[i])/4;
haHigh=MathMax(high[i],MathMax(haOpen,haClose));
haLow=MathMin(low[i],MathMin(haOpen,haClose));


FX4Life 25.06.18 21:06

Zitat:

Zitat von traderdoc (Beitrag 41136)
??????? Was Du aber auch so immer schreibst!

Da gibt es mehrere Buffer, 4 (0 bis 3) sind davon relevant und am wichtigsten die Buffer 0 und 1, die ausreichen, um eine blaue von einer roten Kerze zu unterscheiden.

traderdoc

Hallo traderdoc, ich stehe auf dem Schlauch... Wie soll ich das dann umsetzen?

Mein Versuch es so zu machen, funktioniert nicht. Es wird keine Order ausgelöst...

Code:

double haOpen0,haOpen1,haClose0,haClose1;
double total,ticket,Lots,sl,tp,TrailingStop;

//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
  haClose0=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,3,1);
  haOpen0=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,2,1);

  haClose1=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,3,2);
  haOpen1=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,2,2);
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {

//---
//| Prüfen der Anzahl der Orders
//+------------------------------------------------------------------+
  total=OrdersTotal();
  if(total<1)
    {
      //| Buy
      //+------------------------------------------------------------------+
      if(haOpen0>haClose0 && haOpen1<haClose1)
        {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-sl*Point,Ask+tp*Point,NULL,0,0,clrGreen);
        if(ticket>0)
          {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
              Print("BUY order opend : ",OrderOpenPrice());
          }
        else Print("Error opening BUY Order : ",GetLastError());
        return;
        }
      //| Sell
      //+------------------------------------------------------------------+
      if(haOpen0<haClose0 && haOpen1>haClose1)
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+sl*Point,Bid-tp*Point,NULL,0,0,clrRed);
        if(ticket>0)
          {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
              Print("Sell order opend : ",OrderOpenPrice());
          }
        else Print("Error opening Sell Order : ",GetLastError());
        return;
        }

      //+------------------------------------------------------------------+
    }

Wo liegt mein Fehler?

MA-EA 26.06.18 11:31

https://docs.mql4.com/indicators/icustom

FX4Life 26.06.18 11:54

Zitat:

Zitat von MA-EA (Beitrag 41141)

Hallo MA-EA,

vielen Dank für deinen Hinweis, aber leider bringt mich das nicht weiter. Wie du in meinem vorherigen Post sehen kannst, habe ich den iCustom bereits drinne. Angepasst an den Smoothed und mit dem Index (2&3) vom Heikin Ashi.

Jetzt bin auch bereits einen Schritt weiter...
Ich habe jetzt ein paar Kleinigkeiten verändert und der Code sieht jetzt so aus.

Code:

int OnInit()
  {
//---
  haClose1=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,3,1);
  haOpen1=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,2,1);
                                                           
  haClose2=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,3,2); 
  haOpen2=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,2,2); 
//---
  return(INIT_SUCCEEDED);
  }

Er öffnet zwar jetzt eine Position, aber nur noch BUY und keine Sell.

Code:

//+------------------------------------------------------------------+
void OnTick()
  {
//---
//| Prüfen der Anzahl der Orders
//+------------------------------------------------------------------+
  total=OrdersTotal();
  if(total<1)
    {
      //| Buy
      //+------------------------------------------------------------------+
      if(haOpen1<haClose1)
        {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-sl*Point,Ask+tp*Point,NULL,0,0,clrGreen);
        if(ticket>0)
          {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
            Print("BUY order opend : ",OrderOpenPrice());
          }
        else Print("Error opening BUY Order : ",GetLastError());
        return;
        }
   
      //| Sell
      //+------------------------------------------------------------------+
      if(haOpen1>haClose1)
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+sl*Point,Bid-tp*Point,NULL,0,0,clrRed);
        if(ticket>0)
          {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
            Print("Sell order opend : ",OrderOpenPrice());
          }
        else Print("Error opening Sell Order : ",GetLastError());
        return;
        }
      //+------------------------------------------------------------------+
    }


FX4Life 26.06.18 12:23

Heikin Ashi Smoothed
 
Hallo MA-EA,

ersteinmal vielen Dank für deine Hilfe, aber die Info bringt mich leider nicht weiter... Wie du in meinem Post weiter oben siehst, habe ich bereits den iCustom drinne. Die Werte sind vom Heikin_Ashi_Smoothed und als Index habe ich 2 & 3 genommen.

Ich bin aber bereits einen Shritt weiter gekommen und habe ein paar anpassungen gemacht.

Jetzt öffnet er zwar Positionen, allerdings nur buy :( Und an den Expert Advisor Optionen liegt es nicht. Die sind richtig...

Wer erkennt meinen Fehler?

Code:

int OnInit()
  {
//---
  haClose1=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,3,1);
  haOpen1=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,2,1);
                                                             
  haClose2=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,3,2); 
  haOpen2=iCustom(NULL,0,"Heiken_Ashi_Smoothed",2,4,2,1,2,2); 
//---
  return(INIT_SUCCEEDED);
  }

Ich möchte ertmal das der EA überhaupt läuft und ignorierer daher vorerst den zweiten iCustom.

Code:

void OnTick()
  {
//---
//| Prüfen der Anzahl der Orders
//+------------------------------------------------------------------+
  total=OrdersTotal();
  if(total<1)
    {
      //| Buy
      //+------------------------------------------------------------------+
      if(haOpen1<haClose1)
        {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-sl*Point,Ask+tp*Point,NULL,0,0,clrGreen);
        if(ticket>0)
          {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
            Print("BUY order opend : ",OrderOpenPrice());
          }
        else Print("Error opening BUY Order : ",GetLastError());
        return;
        }
   
      //| Sell
      //+------------------------------------------------------------------+
      if(haOpen1>haClose1)
        {
        ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+sl*Point,Bid-tp*Point,NULL,0,0,clrRed);
        if(ticket>0)
          {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
            Print("Sell order opend : ",OrderOpenPrice());
          }
        else Print("Error opening Sell Order : ",GetLastError());
        return;
        }

      //+------------------------------------------------------------------+
    }


MA-EA 26.06.18 12:47

Sell
Ask + SL ?

FX4Life 26.06.18 13:38

Zitat:

Zitat von MA-EA (Beitrag 41144)
Sell
Ask + SL ?



Hast recht, müsste Bid + SL lauten.

Aber daran dürfte es nicht liegen, da ich genug Abstand habe.


Gesendet von iPhone mit Tapatalk

traderdoc 26.06.18 15:00

Evtl. solltestst Du doch mal andere Buffer benutzen, z.B. 0 und 1.

FX4Life 26.06.18 22:09

Leider geht es auch nicht mit der 0&1



Gesendet von iPhone mit Tapatalk

MA-EA 26.06.18 22:21

Kann er damit eigentlich was anfangen?

"Heiken_Ashi_Smoothed"

Soviel ich weiß, darf nur der korrekte Name des HA eingetragen werden. :confused:


Edit:Gibts eigentlich Fehlermeldungen oder Warnungen?

traderdoc 26.06.18 22:21

Das geht mit Sicherheit:

Code:

double val0, val1;
int HA1_Kerze = 0;

val0 = NormalizeDouble(iCustom(Symbol(), 0, "Heiken_Ashi_Smoothed", HA_MaMethod, HA_MaPeriod, HA_MaMethod2, HA_MaPeriod2, 0, 1), Digits);
val1 = NormalizeDouble(iCustom(Symbol(), 0, "Heiken_Ashi_Smoothed", HA_MaMethod, HA_MaPeriod, HA_MaMethod2, HA_MaPeriod2, 1, 1), Digits);
 
if (val0 < val1) {
  HA1_Kerze = 1;      //blauer HA
} else {
  HA1_Kerze = -1;      //roter HA
}

Ansonsten liegt es wo anders in Deinem Code.

traderdoc

PS: "Kann er damit eigentlich was anfangen?

"Heiken_Ashi_Smoothed"

Soviel ich weiß, darf nur der korrekte Name des HA eingetragen werden."

Das ist der korrekte Name!!

FX4Life 29.06.18 13:37

Hi,

ich habe es mit allem möglichen probiert und es will einfach nicht laufen.

1. Es passt nicht zu meinem Indikator-Bild (Heiken_Ashi_Smoothed). Ich habe den Indikator in den Tester (als template) eingebaut, aber das was ich sehe und was der EA macht, das sind zwei verschiedene Welten.

2. Es werden nur buy orders ausgelöst.

Hier einmal der gesamt Code

Code:

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                      http://www.companyname.net |
//+------------------------------------------------------------------+
#property version  "1.00"
#property strict

double total,ticket;
double Lots=1.0;
int sl =80;
int tp = 200;
double TrailingStop=150;

double val0,val1;
int HA1_Kerze=0;
int  Digits();
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {

  val0 = iCustom(Symbol(), 0, "Heiken_Ashi_Smoothed", 2,4,2,1,0,1);
  val1 = iCustom(Symbol(), 0, "Heiken_Ashi_Smoothed", 2,4,2,1,1,1);

  if(val0<val1)
    {
      HA1_Kerze=1;      //blauer HA
        } else {
      HA1_Kerze=-1;      //roter HA
    }
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
//| Prüfen der Anzahl der Orders
//+------------------------------------------------------------------+
  total=OrdersTotal();
  if(total==0)
      //| Buy
      //+------------------------------------------------------------------+
    {
      if(HA1_Kerze==1)
        {
        ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-sl*Point,Ask+tp*Point,NULL,0,0,clrGreen);
        if(ticket>0)
          {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
            Print("BUY order opend : ",OrderOpenPrice());
          }
        else Print("Error opening BUY Order : ",GetLastError());
        }

      //| Sell
      //+------------------------------------------------------------------+
      if(total==0)
        if(HA1_Kerze==-1)
          {
            ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+sl*Point,Bid-tp*Point,NULL,0,0,clrRed);
            if(ticket>0)
              {
              if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES));
              Print("Sell order opend : ",OrderOpenPrice());
              }
            else Print("Error opening Sell Order : ",GetLastError());

          }
    }
//+------------------------------------------------------------------+
//---Zähler & Close Bedingungen
//+------------------------------------------------------------------+
for(int cnt=0;cnt<total;cnt++)
    {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol())
        {
        if(OrderType()==OP_BUY)
          {
            //Check for Trailling Stop
            //+------------------------------------------------------------------+
            if(TrailingStop>=0)
              {
              if(Bid-OrderOpenPrice()>Point*TrailingStop)
                {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                    OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Point,OrderTakeProfit(),0,Green);
                    return;
                    }
                }
              }
          }
        else // got to short Position
          {
            //Check for TrailingStop
            //+------------------------------------------------------------------+
            if(TrailingStop>0)
              {
              if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                {
                  if(OrderStopLoss()>(Ask+Point*TrailingStop))
                    {
                    OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                    return;
                    }
                }
              }
          }
        //+------------------------------------------------------------------+
        } // "else" Close
      //+------------------------------------------------------------------+
    } //"for" Close
//+------------------------------------------------------------------+
  } //"void" Close
//+------------------------------------------------------------------+

Ich bin für jede weitere Unterstützung dankbar!

traderdoc 29.06.18 14:33

Die Indikatorabfrage gehört auf jeden Fall in die Funktion OnTick(), egal ob direkt per Code oder aufgerufen über eine externe Funktion, z.B. CheckIndicator(). Steht das alles nur! In OnInit(), dann wird die Indikatorabfrage auch nur einmal! durchlaufen.
Diese Funktion braucht auch nur dann aufgerufen zu werden, wenn eine neue Kerze gebildet wird, z.B. per

if (OldTime != Time[0]) {
CheckIndicator();
OldTime = Time[0];
}

Das zweite if (total == 0) ist überflüssig und irgendwas ist auch an der {} Setzung nicht korrekt.

traderdoc

MA-EA 30.06.18 00:04

double total,ticket;

Muss das nicht int sein?

Lad vielleicht mal hoch.

FX4Life 30.06.18 12:56

Zitat:

Zitat von MA-EA (Beitrag 41167)
double total,ticket;

Muss das nicht int sein?

Lad vielleicht mal hoch.



Danke MA-EA,

hast recht. Die Wert sind ganze Zahlen.

Und ebenfalls vielen Dank an Traderdoc, denn jetzt läuft die EA [emoji16]


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