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)
-   -   "Fehler im Code" (http://www.expert-advisor.com/forum/showthread.php?t=3834)

Marlak 06.09.14 10:31

"Fehler im Code"
 
Hallo..
.. ich bin ganz frisch hier und habe seid über 10 Jahren nix mehr programmiert. Nun habe ich ein Video in Youtube gefunden und ich wollte das Teil nachprogrammieren einige Fehler konnte ich selbstständig korrigieren jedoch bei einem abschnitt weiss ich nicht weiter. Die Fehlermeldung lautet:

return value of 'OrderSelect' should be checked

hier mein code:

offeneOrders = 0;
anzahlOrders = OrdersTotal();
for(zaehler=0; zaehler<anzahlOrders;zaehler++)
{OrderSelect(zaehler,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol())
{if(OrderMagicNumber()==Magicnummer){offeneOrders+ +;}}
}

kann mir jemand bitte sagen was ich da vergeigt habe, wäre ganz net

traderdoc 06.09.14 15:33

offeneOrders = 0;
anzahlOrders = OrdersTotal();
for(zaehler=0; zaehler<anzahlOrders;zaehler++)
{if(OrderSelect(zaehler,SELECT_BY_POS,MODE_TRADES) )
{if(OrderSymbol()==Symbol())
{if(OrderMagicNumber()==Magicnummer) offeneOrders++;
}
}
}


traderdoc

Marlak 07.09.14 01:13

Ich bin's wieder...
 
... jetzt habe ich ein neues Problem.
hier erstmal mein Code:

//Order aufgeben
if (ACCOUNT_PROFIT < -100){Lots=1;}
if (ACCOUNT_PROFIT > 100){Lots=4;}
if (Kauf>0 && offeneOrders == 0)
{if (Signal == "LONG")
{ticket=OrderSend(Symbol(),OP_BUY,Lots,Kauf,30,Sto pkurs,Kursziel,"MA Cross",Magicnummer,Green);
if (ticket>0)
{if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Profit: ",OrderProfit);}
else Print("fehlerhaft Entry: ", GetLastError(), Kauf);}}
return;
{if (Signal == "SHORT")
{ticket=OrderSend(Symbol(),OP_SELL,Lots,Kauf,30,St opkurs,Kursziel,"MA Cross",Magicnummer,Red);
if (ticket<0)
{if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Profit: ",OrderProfit);}
else Print("fehlerhaft Entry: ", GetLastError(), Kauf);}}
return;

return;

--------------
Problem Nummer 1: obwohl dieser EA im Backtest ein Positives Ergebniss generiert geht er nur Longs ein. Wo liegt mein Fehler?
Problem Nummer 2: ich möchte gern das wenn der Verlust oder Gewinn eine bestimmte Menge erreicht hat soll die Positionsgröße geändert werden. Wie kann ich das am besten anstellen?

Wäre toll wenn sich jemand meinen kleinen Problemchen annehmen könnte.

traderdoc 07.09.14 11:39

Code:

ACCOUNT_PROFIT = 0;
for(int i = 0; i < OrdersTotal(); i++) {
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol() == Symbol()) {  //falls der Profit für den gesamten Account berechent werden soll, muß diese Zeile entfernt werden
        ACCOUNT_PROFIT += OrderProfit() + OrderSwap() + OrderCommission();
      }
  }
}
Lots = Irgendetwas;        //für die Fälle, dass ACCOUNT_PROFIT >= -100 und <= 100 ist
if (ACCOUNT_PROFIT < -100) Lots=1;
if (ACCOUNT_PROFIT > 100) Lots=4;
if (Kauf>0 && offeneOrders == 0) {  //Kauf > 0???
  if (Signal == "LONG") {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Kauf,30,Stopkurs,Kursziel,"MA Cross",Magicnummer,Green);
  }
  if (Signal == "SHORT") {   
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Kauf,30,Stopkurs,Kursziel,"MA Cross",Magicnummer,Red);
  }
}

Die Variable Kauf mit dessen Wert, der dem aktuellen Kaufpreis entspricht, ist immer > 0!, weil es keinen Preis gibt, der <= 0 ist.

An Deinem hier vorliegenden Codesschipsel kann es nicht liegen, dass er nur Buy-Orders öffnet. Entweder daran: if (Signal == "SHORT"), oder an ungültigen Übergaben von Lots, StopKurs bzw. Kursziel.

Und in Zukunft den Code immer über die oben stehende Auswahl: # eingeben.

traderdoc

Marlak 07.09.14 13:11

Ich kann den Fehler einfach nicht finden, warum der EA keine Short's eingeht,
vielleicht kann mal ein anderer rüber schauen wo der Fehler ist.

Code:

//+------------------------------------------------------------------+
//|                                                    MA Cross.mq4 |
//|                                                          Marlak |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Marlak"
#property link      ""
#property version  "1.00"
#property strict

extern int ATR=14, Gleitener_Durchschnitt=50;
extern double Standardhandelsgroesse=10, Multiplikator=2.618, CRV=3;
string Signal;
double risk1, Kursziel, gewinn, Lots, Stopkurs, Kauf, OrderProfit;
int offeneOrders, anzahlOrders, zaehler, ticket;
int Magicnummer= 001;
//+------------------------------------------------------------------+
//| Expert initialization function                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
 
//---
  return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
 
  }
//+------------------------------------------------------------------+
//| Expert tick function                                            |
//+------------------------------------------------------------------+
void OnTick()
  {
   
//Variablen
  double ma = iMA(NULL,5,Gleitener_Durchschnitt,0,MODE_SMA,PRICE_CLOSE,0);
  double malang = iMA(NULL,240,Gleitener_Durchschnitt,0,MODE_SMA,PRICE_CLOSE,0);
      if (Close[1] > ma && ma > malang){Signal="LONG";}
      if (Close[1] < ma && ma < malang){Signal="Short";}
  Comment ("Signal: "+Signal);
//Einstieg;Ziel;Stop
      risk1 = iATR(NULL,5,ATR,0)*Multiplikator;
      gewinn = risk1* CRV;
      //Risikobewertung
      if (risk1 >50) {Lots=0;}
      if (risk1 <=50) {Lots=Standardhandelsgroesse*0.1;}
        if (risk1 <=40) {Lots=Standardhandelsgroesse*0.3;}
            if (risk1 <=30) {Lots=Standardhandelsgroesse*0.5;}
              if (risk1 <=20) {Lots=Standardhandelsgroesse*0.7;}
                  if (risk1 <=10) {Lots=Standardhandelsgroesse*0.9;}
      if (Signal == "LONG")
        {Kauf = Bid;
          Kursziel = Kauf+gewinn;
          Stopkurs = Kauf-risk1;}
      if (Signal == "Short")
        {Kauf = Ask;
          Kursziel = Kauf-gewinn;
          Stopkurs = Kauf+risk1;}
//Prüfen ob Orders oder Positionen im Markt liegen
offeneOrders = 0;
anzahlOrders = OrdersTotal();
      for(zaehler=0; zaehler<anzahlOrders;zaehler++)
        {if(OrderSelect(zaehler,SELECT_BY_POS,MODE_TRADES) )
            {if(OrderSymbol()==Symbol())
              {if(OrderMagicNumber()==Magicnummer) offeneOrders++;}}}
//Order aufgeben
      if (Kauf>0 && offeneOrders == 0)
        {if (Signal == "LONG")
            {ticket=OrderSend(Symbol(),OP_BUY,Lots,Kauf,30,Stopkurs,Kursziel,"MA Cross",Magicnummer,clrBlueViolet);
              if (ticket>0)
                  {if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Profit: ",OrderProfit);}
                  else Print("fehlerhaft Entry: ", GetLastError(), Kauf);}}
          return;
        {if (Signal == "Short")
            {ticket=OrderSend(Symbol(),OP_SELL,Lots,Kauf,30,Stopkurs,Kursziel,"MA Cross",Magicnummer,clrBlueViolet);
              if (ticket>0)
                  {if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("Profit: ",OrderProfit);}
                  else Print("fehlerhaft Entry: ", GetLastError(), Kauf);}}
          return;
return;
  }
//+------------------------------------------------------------------+


traderdoc 07.09.14 15:22

Code:

if (Signal == "LONG")
        {Kauf = Bid;
          Kursziel = Kauf+gewinn;
          Stopkurs = Kauf-risk1;}
      if (Signal == "Short")
        {Kauf = Ask;
          Kursziel = Kauf-gewinn;
          Stopkurs = Kauf+risk1;}

Ein Fehler liegt auf jeden Fall in der falschen Zuweisung der Kaufkurse.
Richtig wäre:
Code:

if (Signal == "LONG")
        {Kauf = Ask;
          Kursziel = Kauf+gewinn;
          Stopkurs = Kauf-risk1;}
      if (Signal == "Short")
        {Kauf = Bid;
          Kursziel = Kauf-gewinn;
          Stopkurs = Kauf+risk1;}

traderdoc

traderdoc 07.09.14 15:28

Desweiteren sollten double-Ergebnisse v.a. nach Multiplikation bzw. Division mit NormalizeDouble(Wert, Digits) auf die Digits-Kommastelle normiert werden. Das ist v.a. für die OrderSend()-Funktion wichtig.

traderdoc


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