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 MQL5 (http://www.expert-advisor.com/forum/forumdisplay.php?f=221)
-   -   Was mach ich falsch? (http://www.expert-advisor.com/forum/showthread.php?t=5726)

Nefastus 19.06.17 09:14

Was mach ich falsch?
 
Hallo Community ich finde mein fehler nicht er mach nur Buy Trades und keine Sell´s
Kann mir wer auf die Sprünge helfen?
Danke im vorraus
PHP-Code:

//+--------------------------------------------------------------+
//|                                                             Triple SMA.mq5              |
//|                                                              Marcel David                |
//+-------------------------------------------------------------------+

#include<Trade\Trade.mqh>
CTrade  trade;

// Variablen 
//string Version="Triple SMA 001";
//double Balance=0; // Bruttokontostand
//double Equity=0;  // Nettokontostand
//double Bid=0;     // BidPreis aktuell
//double Ask=0;     // AskPreis aktuell
//double OpenPositionVolume =0; //Positionsvolumen
//int PositionsAnzahl=0; // PositionsAnzahl
//int MaximalePositionsAnzahl=100; //maximale Positionsanzahl

void OnTick()
  {  
   
// Ask Preis holen
   
double Ask=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);
   
   
// Bid Preis holen
   
double Bid=NormalizeDouble(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits);

   
// 3 Arrays fuer mehrere Preise erstellen
   
double SMA7Array[],SMA50Array[],SMA100Array[];
   
   
// Definition der Eigenschafften fuer den SMA
   
int SMA7Definition iMA (_Symbol,_Period,7,0,MODE_SMA,PRICE_CLOSE);
      
int SMA50Definition iMA (_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
         
int SMA100Definition iMA (_Symbol,_Period,100,0,MODE_SMA,PRICE_CLOSE);
         
   
// Sortierte Preisarrays von der Aktuellen Kerze abwaerts
   
ArraySetAsSeries(SMA7Array,true);
      
ArraySetAsSeries(SMA50Array,true);
         
ArraySetAsSeries(SMA100Array,true);
         
   
// Definierter EA, eine Lienie, von Kerze 0, 10 Kerzen, in Array speichern
   
CopyBuffer(SMA7Definition,0,0,10,SMA7Array);
      
CopyBuffer(SMA50Definition,0,0,10,SMA50Array);
         
CopyBuffer(SMA100Definition,0,0,10,SMA100Array);
         
   
// Kaufsignal berechnen
   
if (SMA7Array[0]>SMA50Array[0])
      if (
SMA50Array[0]>SMA100Array[0])
      
        {
        
trade.Buy(0.01,NULL,Ask,0,(Ask+10 _Point),NULL);
        }
       
   
// Verkaufsignal berechnen
   
if (SMA7Array[0]<SMA50Array[0])
      if (
SMA50Array[0]<SMA100Array[0])
      
        {
         
trade.Sell(0.01,NULL,Bid,0,(Bid-10 _Point),NULL);
        }

  
  } 


Nefastus 19.06.17 10:18

:)
 
So fehler gefunden^^
man sollte schon im double Bid auch SYMBOL_BID schreiben^^
bis zum nächsten denk fehler
salü euer Nefastus

Nefastus 19.06.17 11:43

eine weitere Frage :)
 
Wie kann ich das so schreiben das er nur EIN Buy und Ein Sell Trade macht und wenn SL/TP ereicht ist wieder ein setzt?

Ich danke für die hilfe muss jetzt Arbeiten gehen bis morgen
euer Nefastus

next user 19.06.17 12:24

Zitat:

Zitat von Nefastus (Beitrag 38970)
Wie kann ich das so schreiben das er nur EIN Buy und Ein Sell Trade macht und wenn SL/TP ereicht ist wieder ein setzt?

Dann musst du halt eine Bedingung einfügen, die überprüft, ob es schon einen Trade gibt. Trifft dies zu, so erstellst du keinen
neuen und überprüfst dann, ob der SL/TP vom besagten Trade erreicht wurde.
Ein typischer Schalter.

Code:

bool schalter = false;

...
...

// Kaufsignal berechnen
if(!schalter)
{
  if(SMA7Array[0] > SMA50Array[0])
      if (SMA50Array[0] > SMA100Array[0])
      {
        trade.Buy(0.01,NULL,Ask,0,(Ask+10 * _Point),NULL);
      }
}
else
{
  //Hier dann Order selektieren und abfragen, ob der Stoploss/Takeprofit erreicht wurde...
  //Sollte nicht schwer sein.
}


Kronenchakra 20.06.17 23:19

Nur so ein kleiner Hinweis: das Handle eines Indikators in der OnTick() jedesmal neu zu erzeugen bremst die Performance enorm. Das gehört in die OnInit()!!!!
Code:

  // Definition der Eigenschafften fuer den SMA
  int SMA7Definition = iMA (_Symbol,_Period,7,0,MODE_SMA,PRICE_CLOSE);
      int SMA50Definition = iMA (_Symbol,_Period,50,0,MODE_SMA,PRICE_CLOSE);
        int SMA100Definition = iMA (_Symbol,_Period,100,0,MODE_SMA,PRICE_CLOSE);

Und warum rückst du das ein???

Die Bezeichnung der Variablen für die Handles würde ich auch anders nennen.
zB: int haSMA7, haSMA50, ha SMA100; // global definiert
Aber das ist Geschmackssache. :)

Nefastus 21.06.17 08:17

Warum es ist wie es ist?
Ich bin einer der das erst lernen muss / will
ich bin gelehrnter Schlosser und Schweißer
habe Famile und daher kaum Zeit
Irgend wie muss man ja mal anfangen auch wenn die Performance trunter leiden muss :D

Nefastus 21.06.17 08:41

Frage
 
Zitat:

Zitat von next user (Beitrag 38973)
Dann musst du halt eine Bedingung einfügen, die überprüft, ob es schon einen Trade gibt. Trifft dies zu, so erstellst du keinen
neuen und überprüfst dann, ob der SL/TP vom besagten Trade erreicht wurde.
Ein typischer Schalter.

Code:

bool schalter = false;

...
...

// Kaufsignal berechnen
if(!schalter)
{
  if(SMA7Array[0] > SMA50Array[0])
      if (SMA50Array[0] > SMA100Array[0])
      {
        trade.Buy(0.01,NULL,Ask,0,(Ask+10 * _Point),NULL);
      }
}
else
{
  //Hier dann Order selektieren und abfragen, ob der Stoploss/Takeprofit erreicht wurde...
  //Sollte nicht schwer sein.
}


reicht das wenn ich if (PositionsTotal()<10) über trade.Buy einsetze?
und sollte ich alles eher in ein Skript schreiben oder in einer Bibliothek setzen?

next user 21.06.17 12:33

Zitat:

Zitat von Nefastus (Beitrag 38989)
Irgend wie muss man ja mal anfangen auch wenn die Performance trunter leiden muss :D

Schon ok, jedoch würde ich dir am Anfang schon raten, kurz zu schauen wo die Unterschiede von "OnTick", "OnInit" ect. sind. ;)

Zitat:

Zitat von Nefastus (Beitrag 38990)
reicht das wenn ich if (PositionsTotal()<10) über trade.Buy einsetze?
und sollte ich alles eher in ein Skript schreiben oder in einer Bibliothek setzen?

Ich dachte, du willst immer jeweils nur EINE Order setzen, wieso sollen jetzt bis zu 10 gesetzt werden?
Wenn du eine Order setzen willst, solange es noch keine 10 sind, so würde ich es nicht über "trade.Buy" setzen.
Die beiden if-Abfragen über "trade.Buy" brauchen ja nicht ausgewertet werden, wenn bereits 10 Trades aktiv sind, also ersetze lieber
Code:

if(!schalter)
durch
Code:

if(PositionsTotal() < 10)
Zum zweiten Teil, gerade am Anfang und bei eher kleineren Sachen sind Bibliotheken (ich gehe mal davon aus, du meinst eine Header-Datei, mqh) nicht notwendig.

Nefastus 21.06.17 19:17

danke für die info
PS: die 0 ist ein schreibfehler -_-
kann mann auch Zeit angaben einbauen so wie Handel ab 9 - 18 Uhr und wechsel dann in ein anderes Skript?
bis später salü

next user 21.06.17 19:37

Zitat:

Zitat von Nefastus (Beitrag 38994)
PS: die 0 ist ein schreibfehler -_-

War das etwa so gemeint?
Code:

if(PositionsTotal() < 1)
Wenn ja, wieso nutzt du nicht einen Schalter, wie ich bereits erwähnt habe?
Zitat:

Zitat von Nefastus (Beitrag 38994)
kann mann auch Zeit angaben einbauen so wie Handel ab 9 - 18 Uhr

Klar. Schau mal in der Dokumentation. Die entsprechenden Zeiten dann verarbeiten ect...
Zitat:

Zitat von Nefastus (Beitrag 38994)
und wechsel dann in ein anderes Skript?

Wie hier bereits gesagt, wieso packst du es nicht in die "OnInit"?


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