Hallo zusammen,
obwohl ich schon andere Indikatoren wie z.B. Keltner Channel mit den iCustom problemlos in meine EAs implementieren konnte, will es mir
mit dem „Extreme_TMA_line_indicator“ einfach nicht so recht gelingen.
Der EA läuft zwar mit dem Indikator, aber die standardmäßige Einstellung „Redraw=Yes“
oder im Indikator-Code „input ENUM_INPUT_YES_NO InpRedraw = INPUT_YES;“ wird nicht genommen, sondern
immer nur die Einstellung „Redraw=No“.
Der visuelle Strategie-Tester benutzt auch die „No“ Einstellung. Der Strategie-Test ohne visuelle Option gibt am Ende des Tests aber einen Chart mit der „Yes“ Einstellung aus.
Über die Parameter der iCustom Funktion klappte es auch nicht, aber ich bin noch nicht so lange dabei und weiß wie nicht genau man „enum“ Variablen übergibt…
Ich würde mich über eure Hilfe sehr freuen, da ich einfach nicht mehr weiterweiß.
und der Code vom Extreme_TMA_line_indicator
Schau dir im Datenfenster (Ctrl+D) die Buffer an. Dieser Indikator hat nur 3 auslesbare! Wie du selbst bemerkst:
0=Middle 2=Up 3=Low
Du kannst nur das auslesen:
CopyBuffer(TmaHandle,0,0,3,BuffTMA); CopyBuffer(TmaHandle,1,0,3,UpTma); CopyBuffer(TmaHandle,2,0,3,LowTma);
PS: Irgendwo hab ich mal einen Indikator gefunden der das mit regression viel glatter zustande bringt. Evtl. findet den jemand.
Schau dir im Datenfenster (Ctrl+D) die Buffer an. Dieser Indikator hat nur 3 auslesbare! Wie du selbst bemerkst:
Du kannst nur das auslesen:
PS: Irgendwo hab ich mal einen Indikator gefunden der das mit regression viel glatter zustande bringt. Evtl. findet den jemand.
Danke für die Antwort.
Ich habe mit den Buffern vieles ausprobiert, aber ohne Erfolg.
Hab auch schon die myBuffAtr_0 (Buffer 4) auf den myUpTma draufaddiert,
was der „Redraw=Yes“ Einstellung sehr nahe kommt, aber nicht 100%ig übereinstimmt...
Ich verstehe nicht ganz, was Du und wo Du es willst!
Im Tester eine Darstellung, im Online-Chart ein Neuzeichnen, woran soll das erkennbar sein?
Hallo,
ich hab den indi erst vor kurzen für eine. Freund in einem ea platziert
im ea definierst du dir diese enum
enum ENUM_INPUT_YES_NO { INPUT_YES = 1, // Yes INPUT_NO = 0 // No }; und dann in die oninitTMAh = iCustom(_Symbol,TMATimeframe,"tma_centered_bands_V5",HalfLength,AtrPeriod,AtrMultiplier,InpThreshold,use_Repaint); ArraySetAsSeries(TMAu,true); ArraySetAsSeries(TMAd,true);
Und für alle anderen, ich war zu faul um die korrektheit des handle abzufragen 😂
edit, die eingabeparameter
input ENUM_DELEMITTER s4; input string TMA_Settings="----TMA Setting---"; input ENUM_TIMEFRAMES TMATimeframe = PERIOD_CURRENT; input int HalfLength = 34; // Centered TMA half period input int AtrPeriod = 100; // Average true range period input double AtrMultiplier =3.5; // Average true range multiplier input double InpThreshold = 0.5; // Trend threshold input ENUM_INPUT_YES_NO use_Repaint=INPUT_YES;
Btw, in meinen Augen ist der indi unbrauchbar, sieht gut aus, ist aber auch im no repaint stark repaintend
Hallo,
ich hab den indi erst vor kurzen für eine. Freund in einem ea platziert
im ea definierst du dir diese enum
Und für alle anderen, ich war zu faul um die korrektheit des handle abzufragen 😂
edit, die eingabeparameter
Btw, in meinen Augen ist der indi unbrauchbar, sieht gut aus, ist aber auch im no repaint stark repaintend
Hallo,
danke, wußte gar nicht das man es auch so machen kann.
Hab das hoffentlich alles richtig angepasst..., aber leider wieder ohne Erfolg...
#include<Trade\Trade.mqh> CTrade trade; enum ENUM_INPUT_YES_NO { INPUT_YES = 1, // Yes INPUT_NO = 0 // No }; int TmaHandle=0; double UpTma[]; double LowTma[]; double MidTma[]; MqlRates PreisInfo[]; double Bid; double Ask; double Balance = 0; double Equity = 0; input double sto = 250; input double tpo = 250; input uint InpPeriodTMA = 56; // Centered TMA half period input uint InpPeriodATR = 100; // Average true range period input double InpMultiplierATR = 2; // Average true range multiplier input double InpThreshold = 0.5; // Trend threshold input ENUM_INPUT_YES_NO InpRedraw = INPUT_YES; int OnInit() { TmaHandle=iCustom(Symbol(),Period(),"Examples\\Extreme_TMA_line_indicator",InpPeriodTMA,InpPeriodATR,InpMultiplierATR,InpThreshold,InpRedraw); if(TmaHandle==INVALID_HANDLE) { Print("*ERROR* Invalid TMA handle"); return(INIT_FAILED); } //Sortieren die Preisinformationen nach Kerzenaktualität ArraySetAsSeries(PreisInfo,true); ArraySetAsSeries(UpTma,true); ArraySetAsSeries(LowTma,true); ArraySetAsSeries(MidTma,true); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } void OnTick(){ Balance=AccountInfoDouble(ACCOUNT_BALANCE); Equity=AccountInfoDouble(ACCOUNT_EQUITY); Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits); Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits); CopyRates(Symbol(),Period(),0,4,PreisInfo); double Kurs_0 = PreisInfo[0].close; double Kurs_1 = PreisInfo[1].close; // Kopiere Daten ins Band-Array für 3 Kerzen CopyBuffer(TmaHandle,2,0,3,UpTma); CopyBuffer(TmaHandle,3,0,3,LowTma); CopyBuffer(TmaHandle,0,0,3,MidTma); // => 0=Middle 2=Up 3=Low // Berechne den Bandwert für die Kerze 0 double myUpTma_0 = UpTma[0]; double myLowTma_0 = LowTma[0]; double myMidTma_0 = MidTma[0]; // If the bar time isn't equal to the saved time, it indicates that we have a new tick static datetime Old_Time; datetime New_Time[1]; bool IsNewBar=false; // copying the last bar time to the element New_Time[0] int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) // ok, the data has been copied successfully { if(Old_Time!=New_Time[0]) // if old time isn't equal to new bar time { IsNewBar=true; // if it isn't a first call, the new bar has appeared if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time); Old_Time=New_Time[0]; // saving bar time } } else { Alert("Error in copying historical times data, error =",GetLastError()); ResetLastError(); return; } //--- EA should only check for new trade if we have a new bar if(IsNewBar==false){ return; } if(PositionsTotal()==0){ if( Kurs_0 > myUpTma_0){ // trade.Buy(0.1,NULL,Ask,(Ask-sto*_Point),(Ask+tpo*_Point),NULL); trade.Sell(0.1,NULL,Bid,(Bid+sto*_Point),(Bid-tpo*_Point),NULL); Print("kurs_0: " ,DoubleToString(Bid)); Print("upTMA[0]: " ,DoubleToString(myUpTma_0,5)); Print("MidTma: " ,DoubleToString(myMidTma_0,5)); Print("LowTMA: " ,DoubleToString(myLowTma_0,5)); } }else{ return; } } // Ende OnTick()
Ich verstehe nicht ganz, was Du und wo Du es willst!
Im Tester eine Darstellung, im Online-Chart ein Neuzeichnen, woran soll das erkennbar sein?
Mit den verschiedenen Strategie-Tester Einstellungen wollte ich nur veranschaulichen,
das der Indikator unterschiedlich dargestelllt wird, obwohl es der gleiche Indikator ist.
Die Ergebnisse aus den Buffern sind immer = "InpRedraw = INPUT_NO" Einstellung, die blauen Linien im Chart.
Die magenta Linien = "InpRedraw = INPUT_YES" Einstellung, die der EA eigentlich handeln soll.
Im live Modus funktioniert der Indikator ganz normal, man kann zwischen den Optionen problemlos switchen.
Na, dann fang doch mal an zu experimentieren.
InpRedraw wird doch nur einmal im Code verwendet:
if(InpRedraw)
Also, da der Debugger mit historischen Daten (Strg+F5) über den Tester läuft setzt da mal einen Debugger halt und kontrolliere den Wert und den Weg!
Du kannst aber auch die Variable ändern:
von
input ENUM_INPUT_YES_NO InpRedraw = INPUT_YES; // Redraw
auf
input bool InpRedraw = true; // true=Redraw false:no
Probier es einfach...
Ich kann dich nicht länger leiden sehen, hatte auch mal so ein besch...eidenes Bufferproblem und war über Hilfe dankbar.
So funktionierts:
//+------------------------------------------------------------------+ //| ExtremumTest.mq5 | //| Copyright © 2019, Ing. Otto Pauser | //| https://www.mql5.com/de/users/kronenchakra | //+------------------------------------------------------------------+ #property copyright "Copyright © 2019, Ing. Otto Pauser" #property link "https://www.mql5.com/de/users/kronenchakra" #property version "1.00" //+------------------------------------------------------------------+ //| definitions | //+------------------------------------------------------------------+ enum ENUM_INPUT_YES_NO // kleine Änderung: ENUMs beginnen, sofern nicht anders angegeben, IMMER bei 0 { INPUT_NO, // No INPUT_YES // Yes }; //+------------------------------------------------------------------+ //| input parameters | //+------------------------------------------------------------------+ input uint InpPeriodTMA = 56; // TMA period input uint InpPeriodATR = 100; // ATR period input double InpMultiplierATR = 2.0; // ATR multiplier input double InpThreshold = 0.5; // Trend threshold input ENUM_INPUT_YES_NO InpRedraw = INPUT_YES; // Redraw //+------------------------------------------------------------------+ //| global definitions | //+------------------------------------------------------------------+ int haTMA; double buTmaMid[], buTmaTop[], buTmaBot[]; int toCopy=3; double myTmaMid_0, myTmaTop_0, myTmaBot_0; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { haTMA=iCustom(_Symbol,_Period,"Examples\\Extreme_TMA_line_indicator",InpPeriodTMA,InpPeriodATR,InpMultiplierATR,InpThreshold,InpRedraw); if(haTMA==INVALID_HANDLE) { Alert("*ERROR* Invalid TMA handle"); return(INIT_FAILED); } ArraySetAsSeries(buTmaMid,true); ArraySetAsSeries(buTmaTop,true); ArraySetAsSeries(buTmaBot,true); return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { if(CopyBuffer(haTMA,0,0,toCopy,buTmaMid)!=toCopy) return; if(CopyBuffer(haTMA,2,0,toCopy,buTmaTop)!=toCopy) return; if(CopyBuffer(haTMA,3,0,toCopy,buTmaBot)!=toCopy) return; myTmaMid_0 = buTmaMid[0]; myTmaTop_0 = buTmaTop[0]; myTmaBot_0 = buTmaBot[0]; Comment( "\nmyTmaMid_0: "+DoubleToString(myTmaMid_0,_Digits)+ "\nmyTmaTop_0: "+DoubleToString(myTmaTop_0,_Digits)+ "\nmyTmaBot_0: "+DoubleToString(myTmaBot_0,_Digits) ); } //+------------------------------------------------------------------+ //| Utilities | //+------------------------------------------------------------------+ bool IsNewBar(void) // returns true if new candle was born { static datetime oldTime=WRONG_VALUE; datetime barTime=iTime(_Symbol,_Period,0); if(oldTime==WRONG_VALUE) oldTime=barTime; if(barTime==oldTime) return(false); else oldTime=barTime; return(true); }
Der Grund warum du verzweifelt bist ist der ColorBuffer, der sich bei der Bufferindizierung dazwischen schiebt.
Deshalb musst du Buffer 0,2,3 auslesen. 1 ist der Colorbuffer. Auch den könntest du lesen, da steht der Farbindex drin.
Die Funktion IsNewBar() gibt's als Draufgabe.
Tips: lass den Styler deinen Code bearbeiten. ich hab den Styler auf GNU eingestellt.
OnDeinit() kannst du einfach weglassen, sofern du sie nicht brauchst.
Funktionen wie IsNewBar() lagere in zB: myUtilities.mqh aus und verwende sie mit #include <myUtilities.mqh>
LG Otto
Ich kann dich nicht länger leiden sehen, hatte auch mal so ein besch...eidenes Bufferproblem und war über Hilfe dankbar.
So funktionierts:
Der Grund warum du verzweifelt bist ist der ColorBuffer, der sich bei der Bufferindizierung dazwischen schiebt.
Deshalb musst du Buffer 0,2,3 auslesen. 1 ist der Colorbuffer. Auch den könntest du lesen, da steht der Farbindex drin.
Die Funktion IsNewBar() gibt's als Draufgabe.
Tips: lass den Styler deinen Code bearbeiten. ich hab den Styler auf GNU eingestellt.
OnDeinit() kannst du einfach weglassen, sofern du sie nicht brauchst.
Funktionen wie IsNewBar() lagere in zB: myUtilities.mqh aus und verwende sie mit #include <myUtilities.mqh>
LG Otto
Danke für die Tips und die IsNewBar() Funktion, die werde ich mir mal genauer ansehen...
Ich habe deinen Code ausprobiert, aber das Problem ist noch da.
Mit den Buffernummern habe ich normalerweise keine Probleme, nur bei diesem Indikator, der Spuck immer nur die
InpRedraw = INPUT_NO
Ergebnisse aus, im Bild ist es das rote Linienpaar.
Der EA soll aber das hellblaue Linienpaar handeln, was laut Indikator-Code auch die Standard Einstellung ist.
LG
Paul
Der EA soll aber das hellblaue Linienpaar handeln, was laut Indikator-Code auch die Standard Einstellung ist.
Jetzt habe ich das Problem begriffen. Der letzte Inputparameter wird einfach nicht an den Indi weitergegeben.
Lass den letzten Parameter (inpRedraw) einfach weg, dann sollte der Indi die Standardeinstellung nehmen.
Im Prinzip könntest du alle weglassen, kannst aber dann nix mehr optiomieren.
ChartIndicatorAdd(0,0,haTMA);
Wenn du das in die OnInit() einfügst siehst du den Indi im Chart. (nicht nur im Tester).
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
Hallo zusammen,
obwohl ich schon andere Indikatoren wie z.B. Keltner Channel mit den iCustom problemlos in meine EAs implementieren konnte, will es mir
mit dem „Extreme_TMA_line_indicator“ einfach nicht so recht gelingen.
Der EA läuft zwar mit dem Indikator, aber die standardmäßige Einstellung „Redraw=Yes“
oder im Indikator-Code „input ENUM_INPUT_YES_NO InpRedraw = INPUT_YES;“ wird nicht genommen, sondern
immer nur die Einstellung „Redraw=No“.
Der visuelle Strategie-Tester benutzt auch die „No“ Einstellung. Der Strategie-Test ohne visuelle Option gibt am Ende des Tests aber einen Chart mit der „Yes“ Einstellung aus.
Über die Parameter der iCustom Funktion klappte es auch nicht, aber ich bin noch nicht so lange dabei und weiß wie nicht genau man „enum“ Variablen übergibt…
Ich würde mich über eure Hilfe sehr freuen, da ich einfach nicht mehr weiterweiß.
und der Code vom Extreme_TMA_line_indicator