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)
-   -   Wenn Wert bei X war und Y durchkreuzt (http://www.expert-advisor.com/forum/showthread.php?t=6133)

thmatzer 09.06.18 08:39

Wenn Wert bei X war und Y durchkreuzt
 
Hallo,

ich habe mir einen CCI EA erstellt und habe damit ein kleines Problem.
Mein Wunsch: Wenn zB. der CCI bei -120 war und -100 durchkreuzt soll ein Trade eröffnet werden.

Geschrieben ist es jetzt so wenn der CCI den Wert -100 durchkreuzt (von Unten nach Oben) wird ein Trade eröffnet.
Doch hier entsteht schon das erste Problem: Manchmal wird sogor bereits ein Trade eröffnet wenn der Wert -100 von Oben nach Unten durchkreuzt wird. (Beispiel: CCI geht von +1 auf -100 und bereits hier wird schon ein Trade eröffnet, obwohl der Trade erst eröffnen soll, wenn der CCI von zB -120 durch -100 geht)


Die Lösung wäre wahrscheinlich eine Schleife einzubauen, leider bekomme ich das einfach nicht Fehlerfrei hin, könnte mir da wer helfen?

Hier wäre der Code:

Code:

  //Open Buy Order, instant signal is tested first
  RefreshRates();
  if(Cross(6, iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, CCI_Shift) > Buy_wenn_X_durchkreuzt) //Commodity Channel Index crosses above fixed value
  && Bid > iMA(NULL, PERIOD_CURRENT, MA_Period, MA_Shift, MODE_EMA, PRICE_CLOSE, Shift) + OpenTrade_EntfernungMA * Point() //Price > Moving Average + fixed value
  )
    {
      RefreshRates();
      price = Ask;
      SL = StopLoss * Point(); //Stop Loss = value in points (relative to price)
      if(TimeCurrent() - LastTradeTime < NextOpenTradeAfterMinutes * 60) return; //next open trade after time
      if(!inTimeInterval(TimeCurrent(), TOD_From_Hour, TOD_From_Min, TOD_To_Hour, TOD_To_Min)) return; //open trades only at specific times of the day 
      if(IsTradeAllowed())
        {
        ticket = myOrderSend(OP_BUY, price, TradeSize, "");
        if(ticket <= 0) return;
        }
      else //not autotrading => only send alert
        myAlert("order", "");
      LastTradeTime = TimeCurrent();
      myOrderModifyRel(ticket, SL, 0);
    }
 
  //Open Sell Order, instant signal is tested first
  RefreshRates();
  if(Cross(7, iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, CCI_Shift) < Sell_wenn_X_durchkreuzt) //Commodity Channel Index crosses below fixed value
  && Bid < iMA(NULL, PERIOD_CURRENT, MA_Period, MA_Shift, MODE_EMA, PRICE_CLOSE, Shift) - OpenTrade_EntfernungMA * Point() //Price < Moving Average - fixed value
  )
    {
      RefreshRates();
      price = Bid;
      SL = StopLoss * Point(); //Stop Loss = value in points (relative to price)
      if(TimeCurrent() - LastTradeTime < NextOpenTradeAfterMinutes * 60) return; //next open trade after time
      if(!inTimeInterval(TimeCurrent(), TOD_From_Hour, TOD_From_Min, TOD_To_Hour, TOD_To_Min)) return; //open trades only at specific times of the day 
      if(IsTradeAllowed())
        {
        ticket = myOrderSend(OP_SELL, price, TradeSize, "");
        if(ticket <= 0) return;
        }
      else //not autotrading => only send alert
        myAlert("order", "");
      LastTradeTime = TimeCurrent();
      myOrderModifyRel(ticket, SL, 0);
    }


MA-EA 09.06.18 15:34

Ich glaube, Du musst ihm nur besser erklären, was er machen soll.

Nimm BID raus und benutz nur die Werte, die der CCI liefert.

Parameter:

extern double CCI_indicator_level1=-100.0;
extern double CCI_indicator_level2=100.0;
extern int InpCCIPeriod=14;
input ENUM_APPLIED_PRICE CCI_Price=PRICE_TYPICAL;


CCI Deklaration:

double CCI=iCCI(_Symbol,_Period,InpCCIPeriod,CCI_Price,1) ;
(//CCI_IL1=-100.0 / CCI_IL2=(+)100.0 ? )




Bedingungen:

if (CCI > CCI_indicator_level1 && CCI < 0.0) long gehn
if (CCI < CCI_indicator_level2 && CCI > 0.0) short gehn

Hab aber ewig nix mit dem CCI am Hut gehabt. :rolleyes: Vielleicht verwechsel ich die Lines. Musst mal schaun bzw. testen.

Edit:Erzähl dann bitte mal, wie er so abschneidet. ;)

thmatzer 09.06.18 21:43

Zitat:

Zitat von MA-EA (Beitrag 41091)
Ich glaube, Du musst ihm nur besser erklären, was er machen soll.

Nimm BID raus und benutz nur die Werte, die der CCI liefert.

Parameter:

extern double CCI_indicator_level1=-100.0;
extern double CCI_indicator_level2=100.0;
extern int InpCCIPeriod=14;
input ENUM_APPLIED_PRICE CCI_Price=PRICE_TYPICAL;


CCI Deklaration:

double CCI=iCCI(_Symbol,_Period,InpCCIPeriod,CCI_Price,1) ;
(//CCI_IL1=-100.0 / CCI_IL2=(+)100.0 ? )




Bedingungen:

if (CCI > CCI_indicator_level1 && CCI < 0.0) long gehn
if (CCI < CCI_indicator_level2 && CCI > 0.0) short gehn

Hab aber ewig nix mit dem CCI am Hut gehabt. :rolleyes: Vielleicht verwechsel ich die Lines. Musst mal schaun bzw. testen.

Edit:Erzähl dann bitte mal, wie er so abschneidet. ;)


Hab ich versucht, funktioniert leider so nicht. :confused:

Jemand eine Lösung?


PS: Ich berichte gerne, wenn ich den EA mal zum laufen bekomme :D


lg thmatzer

traderdoc 09.06.18 22:02

In dem von Dir geposteten Code, ersieht man überhaupt nicht, wann der Trade bei welchem CCI geöffnet wird. D.h. der Code ist so nicht nachvollziehbar. Und solange er das nicht ist, brauchen wir hier auch nicht weiterrätseln.

@MA-EA, das wundert mich, denn Du hast uns monatelang mit Deinem CCI drangsaliert.

traderdoc

thmatzer 09.06.18 22:18

Zitat:

Zitat von traderdoc (Beitrag 41093)
In dem von Dir geposteten Code, ersieht man überhaupt nicht, wann der Trade bei welchem CCI geöffnet wird. D.h. der Code ist so nicht nachvollziehbar. Und solange er das nicht ist, brauchen wir hier auch nicht weiterrätseln.

@MA-EA, das wundert mich, denn Du hast uns monatelang mit Deinem CCI drangsaliert.

traderdoc

Tut mir leid, hab ich leider vergessen zu erwähnen:

Buy_wenn_X_durchkreuzt = -120
Sell_wenn_X_durchkreuz = +120


Was ich gerne haben will:

Buy:
Sobald der CCI von unten (zb. -150) durch -120 geht, soll ein Buy-Order eröffnet werden

Sell:
Sobald der CCI von oben (zB. +150) durch +120 geht, soll ein Sell-Order eröffnet werden

traderdoc 09.06.18 22:42

OK und was ist das für eine Funktion?:

Cross(6, iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, CCI_Shift) > Buy_wenn_X_durchkreuzt)

Was bewirkt die 6 und was wird in dieser Funktion berechnet?

So, wenn Buy_wenn_X_durchkreuzt = -120 sein soll, dann würde

iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, CCI_Shift) > Buy_wenn_X_durchkreuzt

immer dann true werden, solange!! der CCI > Buy_wenn_X_durchkreuzt ist.

Richtig wäre hier:

double CCI_1 = iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, 1);
double CCI_2 = iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, 2);

if (CCI_2 < Buy_wenn_X_durchkreuzt && CCI_1 > Buy_wenn_X_durchkreuzt) {
...
}

D.h. es muss beim Kreuzen immer der Zustand der vorletzen zur letzten geschlossenen Kerze oder der letzten geschlossenen zur aktuellen Kerze (0) betrachtet werden.

traderdoc

MA-EA 09.06.18 22:56

Zitat:

Zitat von thmatzer (Beitrag 41094)
Tut mir leid, hab ich leider vergessen zu erwähnen:

Buy_wenn_X_durchkreuzt = -120
Sell_wenn_X_durchkreuz = +120


Was ich gerne haben will:

Buy:
Sobald der CCI von unten (zb. -150) durch -120 geht, soll ein Buy-Order eröffnet werden

Sell:
Sobald der CCI von oben (zB. +150) durch +120 geht, soll ein Sell-Order eröffnet werden

Bei Sell kannst "+" weg lassen.


Als double deklarieren.


Gibts da überhaupt 150? Wenn dann allerhöchstens 150.0


Erklär mal ganz genau was das Gerät machen soll. :confused:


Edit:Und wenn die (vor-) letzte Kerze z.B. nicht 150 sondern kleiner als Deine 120 war?


Und warum eigentlich bei 120? Gut möglich dass da noch ungünstiger oder nen Seitwärtstrend herrscht.

traderdoc 09.06.18 23:07

@MA-EA, lies Dir mal mein Post genau durch.
Das hatten wir bei Deinem CCI-Thread alles schon einmal!

traderdoc

thmatzer 09.06.18 23:18

Zitat:

Zitat von traderdoc (Beitrag 41095)
OK und was ist das für eine Funktion?:

Cross(6, iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, CCI_Shift) > Buy_wenn_X_durchkreuzt)

Was bewirkt die 6 und was wird in dieser Funktion berechnet?

So, wenn Buy_wenn_X_durchkreuzt = -120 sein soll, dann würde

iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, CCI_Shift) > Buy_wenn_X_durchkreuzt

immer dann true werden, solange!! der CCI > Buy_wenn_X_durchkreuzt ist.

Richtig wäre hier:

double CCI_1 = iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, 1);
double CCI_2 = iCCI(NULL, PERIOD_CURRENT, CCI_Period, PRICE_TYPICAL, 2);

if (CCI_2 < Buy_wenn_X_durchkreuzt && CCI_1 > Buy_wenn_X_durchkreuzt) {
...
}

D.h. es muss beim Kreuzen immer der Zustand der vorletzen zur letzten geschlossenen Kerze oder der letzten geschlossenen zur aktuellen Kerze (0) betrachtet werden.

traderdoc


Danke für deine schnelle Hilfe! Das ist aber leider nicht genau das, was ich wollte. Bei dem Code wird der Trade ja nur um 1 Kerze verschoben, also sobald der CCI -120 kreuzt (egal ob von oben oder von unten) wird ab der nächsten Kerze ein Trade eröffnet.

Mein Vorhaben wäre ja, wenn der CCI sich beispielsweiße von -150 sich in Richtung andere Seite bewegt (sagen wir mal zu +100) und sobald der CCI -120 durchkreuzt, soll der Trade eröffnet werden, und wirklich genau dann und nicht 1 Kerze später etc.

Ist sowas umsetzbar?


lg thmatzer

traderdoc 09.06.18 23:31

Zitat:

Zitat von thmatzer (Beitrag 41098)
Danke für deine schnelle Hilfe! Das ist aber leider nicht genau das, was ich wollte. Bei dem Code wird der Trade ja nur um 1 Kerze verschoben, also sobald der CCI -120 kreuzt (egal ob von oben oder von unten) wird ab der nächsten Kerze ein Trade eröffnet.

Mein Vorhaben wäre ja, wenn der CCI sich beispielsweiße von -150 sich in Richtung andere Seite bewegt (sagen wir mal zu +100) und sobald der CCI -120 durchkreuzt, soll der Trade eröffnet werden, und wirklich genau dann und nicht 1 Kerze später etc.

Ist sowas umsetzbar?

lg thmatzer

Der Code erledigt genau das, was Du willst.
Nein, der Trade würde nur eröffnet werden, wenn der CCI von unten nach oben die -120 kreuzt.
Deshalb habe ich ja such geschrieben, dass Shift = 2 und Shift = 1 benutzt werden soll, wenn auf den Kerzenwechsel geöffnet werden soll oder Shift = 1 und Shift = 0, wenn der CCI der letzten geschlossenen Kerze und der CCI der aktuellen Kerze zum Öffnen dienen soll.

traderdoc


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