Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.


Portalsuche


Werbung

Login
Benutzername:
Kennwort:


Statistik
Themen: 3824
Beiträge: 37445
Benutzer: 6.084
Aktive Benutzer: 495
Links: 80
Wir begrüßen unseren neuesten Benutzer: victorschenker
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 45 Minuten
- victorsche...
vor 12 Stunden
- Wombat
vor einem Tag
- idur
vor einem Tag
- DarthTrade...
vor 2 Tagen
- Eren

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 76
Gesamt: 76
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Werbung

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 22.01.16
Benutzerbild von trololotromberino
Mitglied
 
Registriert seit: Jul 2015
Beiträge: 56
trololotromberino befindet sich auf einem aufstrebenden Ast
Standard Eigene Funktion für Orderaufgabe

Hallo mal wieder

ich versuche mich immer weiter an neuen codes, bzw. schreibe die alten Codes um.
Ich habe versucht, meinen ersten Code mal etwas anders zu fassen und ihn so schneller zu machen.
Dazu wollte ich eigentlich die verschiedenen Orderaufgaben in eigene Funktionen schreiben.
Leider gibt der EA aktuell gar keine Order aus, geschweige denn kommuniziert irgendwie mit dem MT....Könnt ihr mir vielleicht meinen Fehler zeigen?

Code:
//+------------------------------------------------------------------+
//|                                            Neuer Versuch neu.mq4 |
//|                                                Korbinian Gabriel |
//|                                                                - |
//+------------------------------------------------------------------+
#property copyright "Korbinian Gabriel"
#property link      "-"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

/*Idee: Wenn ATR unter bestimmten Wert ist, dann werden Trades sofort auf break even gezogen, sobald es möglich ist;
Aktuell liegt noch ein Fehler im Ordersendverfahren vor*/

//--- Extern variables
extern int Mx=0; 
extern int abst=3;
extern int irsi=14;
extern int iboll=20;
extern int st1=10;
extern double st2=3.0;
extern int slippage = 100; 
extern double takeprofit = 0; 
extern bool autostoploss = true; 
extern double manualsl = 20; 
extern int magicnumber = 1; 

extern double Lots  = 1.0;     

//--- Intern variables
int Oldbar = 0; 

double st1_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1);
double st1_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1);
double st2_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2);
double st2_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2);


double BBUP = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_UPPER,0);
double BBDN = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_LOWER,0);

double rsi1 = iRSI(NULL,0,irsi,PRICE_CLOSE,1);
double rsi0 = iRSI(NULL,0,irsi,PRICE_CLOSE,0); // hier möglicherweise die zahl zu 2 tauschen

int autosl,stoploss;

//--- Functions
int anzTradesLong() {
   int ord=0;
   int total = OrdersTotal();
   for(int i=0;i<=total-1;i++) {
      if(OrderSelect(i,SELECT_BY_POS)       
         && OrderType() == OP_BUY
         && OrderSymbol() == Symbol())
            ord++;
   }
   return (ord); 
}

int anzTradesShort() {
   int ord=0;
   int total = OrdersTotal();
   for(int i=0;i<=total-1;i++) {
      if(OrderSelect(i,SELECT_BY_POS)      
         && OrderType() == OP_SELL
         && OrderSymbol() == Symbol())
            ord++;
   }
   return (ord); 
}

bool long_st(){
   return st1_long < Close[1] && st1_short > Close[2];
   }

bool short_st(){
   return st1_long > Close[1] && st1_short < Close[2];
   }

//--- Look for the orderexecution:
      void execution(){
         if(OrdersTotal() > 0) Print("Order successfully placed",OrderMagicNumber(),OrderStopLoss(),OrderSymbol(),OrderType());
         else Print("ERROR while placing order occured!", GetLastError());
         }

//Maybe rsi signal for orderopening!!
int ordersend; 
void OpenLongOrderatBB(){
   ordersend = OrderSend(NULL,OP_BUY,Lots,BBUP,slippage,stoploss,takeprofit,"Open Pending Long Order at upper Bollinger Band",magicnumber,0,Green);
   if(ordersend == 0) Alert("OrderSend ERROR LongOrder NOT opened!", GetLastError());
   if(ordersend != 0) Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());

   }

void OpenShortOrderatBB(){
   ordersend = OrderSend(NULL,OP_SELL,Lots,BBDN,slippage,stoploss,takeprofit,"Open Pending Short Order at lower Bollinger Band",magicnumber,0,Red);
   if(ordersend == 0) Alert("OrderSend ERROR ShortOrder NOT opened!", GetLastError());
   if(ordersend != 0) Print("Opened ShortOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());

   }

void OpenLongOrderMarket(){
   ordersend = OrderSend(NULL,OP_BUY,Lots,Ask,slippage,stoploss,takeprofit,"Open Market Long Order",magicnumber,0,Green);
   if(ordersend == 0) Alert("OrderSend ERROR LongOrder NOT opened!", GetLastError());
   if(ordersend != 0) Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());
   }

void OpenShortOrderMarket(){
   ordersend = OrderSend(NULL,OP_BUY,Lots,Bid,slippage,stoploss,takeprofit,"Open Market Short Order",magicnumber,0,Red);
   if(ordersend == 0) Alert("OrderSend ERROR ShortOrder NOT opened!", GetLastError());
   if(ordersend != 0) Print("Opened ShortOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());
   }
//--- On expert-advisor initiation
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
int start()
  {
   if(Oldbar != Bars) {
   
//---
    
//---Stoplossdefinition
      if(OrderType() == OP_BUY) autosl = st1_long - abst;
      if(OrderType() == OP_SELL) autosl = st1_short + abst; 
      if(autostoploss == true) stoploss = autosl; 
      if(autostoploss == false) stoploss = manualsl;
      
//--- Initializing Orders
      if(st1_long < st2_short) OpenLongOrderatBB(); execution();
      if(st1_long < st2_short && Close[1] > BBUP) OpenLongOrderMarket(); execution();
      if(st2_long > st1_short) OpenShortOrderatBB(); execution(); 
      if(st2_long > st1_short && Close[1] < BBDN) OpenShortOrderMarket(); execution(); 
      
//--- Closing Orders
      if(rsi1 < 30 && rsi0 > 30)
      {
         int total = OrdersTotal();
         for(int i=0;i<=total-1;i++) {
            if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird. 
               if(OrderCommission()+OrderProfit()+OrderSwap()>0) {
                  Print ("Order closing now, because of RSI-Signal!");
                  bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS),OrderLots(),Ask,10); //Komisch: Wenn ich SELECT_BY_TICKET auswähle, funktioniert der Trailingstop nicht
                  if (result == true)
                     Print ("Orderclosing ",OrderTicket()," succeeded");
                  else
                     Print ("Orderclosing ",OrderTicket()," failed");
               }
            }
         }
      }
      
      if(rsi1 > 70 && rsi0 < 70)
      {
         int total = OrdersTotal();
         for(int i=0;i<=total-1;i++) {
            if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird. 
               if(OrderCommission()+OrderProfit()+OrderSwap()>0) {
                  Print ("Order closing now, because of RSI-Signal!");
                  bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS),OrderLots(),Bid,10); //Komisch: Wenn ich SELECT_BY_TICKET auswähle, funktioniert der Trailingstop nicht
                  if (result == true)
                     Print ("Orderclosing ",OrderTicket()," succeeded");
                  else
                     Print ("Orderclosing ",OrderTicket()," failed");
               }
            }
         }
      }

   
   }
   Oldbar = Bars;    
   return(0);
  }
//+------------------------------------------------------------------+
Vielen Dank und Grüße
trololotromberino
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter!
Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten:
www.expert-advisor.com/etsbh
  #2 (permalink)  
Alt 22.01.16
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 1.875
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Nur mal grob überflogen.

Die Variablen:
double st1_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1);
double st1_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,1);
double st2_long = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2);
double st2_short = iCustom(NULL,0,"SuperTrend1",st1,st2,0,2);
double BBUP = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_UPPER,0);
double BBDN = iBands(NULL,0,iboll,2,2,PRICE_CLOSE,MODE_LOWER,0);
double rsi1 = iRSI(NULL,0,irsi,PRICE_CLOSE,1);
double rsi0 = iRSI(NULL,0,irsi,PRICE_CLOSE,0); // hier möglicherweise die zahl zu 2 tauschen
kommen alle unter if(Oldbar != Bars) {

if(OrderType() == OP_BUY) autosl = st1_long - abst;
if(OrderType() == OP_SELL) autosl = st1_short + abst;
Dazu muß vorher eine offene Order selektiert sein!

void OpenLongOrderatBB(){
ordersend = OrderSend(NULL,OP_BUY,Lots,BBUP,slippage,stoploss,takeprofit,"Open

void OpenShortOrderatBB(){
ordersend = OrderSend(NULL,OP_SELL,Lots,BBDN,slippage,stoploss,takeprofit,"Open
Hier müssen natürlich auch die entsprechenden PendingOrders eingetragen werden!

void OpenShortOrderMarket(){
ordersend = OrderSend(NULL,OP_BUY,Lots,Bid,slippage,
Das soll doch eine SellOrder werden!!

for(int i=0;i<=total-1;i++) {
if(OrderSelect(i,SELECT_BY_POS)) { // Part soll dafür sorgen, dass nur 1 Position pro Signal eröffnet wird.
if(OrderCommission()+OrderProfit()+OrderSwap()>0) {
Print ("Order closing now, because of RSI-Signal!");
bool result = OrderClose(OrderSelect(OrderTicket(), SELECT_BY_POS)
Das wäre falsch!

ordersend = OrderSend(NULL,OP_BUY,Lots,BBUP,slippage,stoploss,takeprofit,
Hier dürfen nicht die nackten Pipwerte der Marken genommen werden, sondern die tatsächlichen Preise!

Wenn ich Dir einen guten Ratschlag geben darf: Beim Programmieren das jeweilige MQL-Wort markieren und F1 drücken und genau die Hilfe durchlesen.
Das geht schneller als auf diesem Deinen Weg.
Und v.a. sich an fertigen lauffähigen Programmen orientieren.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #3 (permalink)  
Alt 25.01.16
Benutzerbild von trololotromberino
Mitglied
 
Registriert seit: Jul 2015
Beiträge: 56
trololotromberino befindet sich auf einem aufstrebenden Ast
Standard

Was ich noch nicht ganz verstanden habe, ist, dass wenn ich die Variablen unter das Oldbars schreibe (also auch unter int start), er mir dann sagt, dass diese Variablen für die void Funktionen nicht zur Verfügung stehen (sie sind nicht definiert). Wenn ich aber die void Funktionen noch unter die Variablen schreibe, geht das nicht, weil void nicht in die start Funktion darf.
Kann man void irgendwie ersetzen? Weil ich kann die oldbar Funktion ja auch nicht aus der start Funktion raus nehmen.....
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter!
Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten:
www.expert-advisor.com/etsbh
  #4 (permalink)  
Alt 28.01.16
Benutzerbild von trololotromberino
Mitglied
 
Registriert seit: Jul 2015
Beiträge: 56
trololotromberino befindet sich auf einem aufstrebenden Ast
Standard

Das vorherige Problem konnte ich lösen, indem ich die Variablen vor der Start-Funktion nannte und in dieser dann definierte.

Allerdings bin ich jetzt auf ein neues großes Problem gestoßen:
Ich kriege, egal was ich mache, immer einen Fehler Error 4107.
F1 oder Google haben nicht geholfen. Ich habe versucht es durch *Point oder auch durch NormalizeDouble(stoploss,Digits()) probiert, aber ich kriege ihn immernoch.
Der Code ist sehr umfangreich, ich werde ihn trotzdem mal anheften. Ansonsten sind hier die Dinge, die mit dem Stoploss zu tun haben:
Code:
int start(){

....

//---Stoplossdefinition
      
      if(OrderType() == OP_BUY || OrderType() == OP_BUYSTOP) stoploss = st1_long - abst;
      if(OrderType() == OP_SELL || OrderType() == OP_SELLSTOP) stoploss = st1_short + abst; 
      NormalizeDouble(stoploss,Digits());      
//--- Trailingstoploss
      if(OrdersTotal() > 0){Trailingstoploss();}
      if(OrdersTotal() > 0){ClosingTrades();}
      OpenLongOrderatBBModify();
      OpenShortOrderatBBModify();
}

void OpenLongOrderatBB(){
   new_del();
   ordersend = OrderSend(NULL,OP_BUYSTOP,Lots,NormalizeDouble(BBUP,Digits()),slippage,stoploss*Point,takeprofit,"Open Pending Long Order at upper Bollinger Band",magicnumber,0,Green);
   if(ordersend < 0) Alert("OrderSend ERROR LongOrder at BB NOT opened! ", GetLastError());
   else Print("Opened LongOrder: ",OrderMagicNumber()," on ",OrderSymbol(), "Lots: ",OrderLots()," StopLoss: ",OrderStopLoss()," TakeProfit: ",OrderTakeProfit());

   }

....

void OpenLongOrderatBBModify(){
      for(int i=0;i<=total-1;i++) {
      if(OrderSelect(i,SELECT_BY_TICKET)       
         && OrderType() == OP_BUYSTOP
         && OrderSymbol() == Symbol()
         && OrderCloseTime()==0  
         && OrderType()==OP_BUYSTOP ) {
            if(OrderOpenPrice() < BBUP) {
               ordermodify = OrderModify(OrderTicket(),NormalizeDouble(BBUP,Digits()),stoploss*Point,takeprofit,0);
               if (ordermodify == false)
                  Print("Stoploss ",OrderTicket()," NICHT nachgezogen! ERROR!");
               else
                  Print("StopLoss ",OrderTicket()," nachgezogen");
            }
         }
      }
   }

//--- Dieser Teil löscht unausgeführte Pending Orders.
int new_del()
 {
    int i,a;
    int total = OrdersTotal();
    string comentario,par;
    for (i=total-1; i >=0; i--)
    {
       OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
       if (OrderType()==OP_BUY || OrderType()==OP_SELL)
       {
          for (a=total-1; a >=0; a--)
          {
             OrderSelect(a,SELECT_BY_POS,MODE_TRADES);
             comentario=OrderComment();
             par=StringSubstr(comentario,0,6); 
             if(OrderType()==OP_SELLSTOP)// && comentario==Symbol())
             {
                OrderDelete(OrderTicket());
                Print("Deleting SELL_STOP"," Ordertype:",OrderType());
                return(1);
             }
             if(OrderType()==OP_BUYSTOP)// && par==Symbol())
             {
                OrderDelete(OrderTicket());
                Print("Deleting BUY_STOP"," Ordertype:",OrderType());
                return(1);
             }
          }
       }
    }
 return(1);
 }
Vielleicht habt ihr noch eine Idee?

LG
Angehängte Dateien
Dateityp: mq4 Neuer Versuch neu.mq4 (15,1 KB, 1x aufgerufen)
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter!
Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten:
www.expert-advisor.com/etsbh
  #5 (permalink)  
Alt 28.01.16
Benutzerbild von Crashbulle
Elite Mitglied
 
Registriert seit: Sep 2011
Ort: Voreifel
Beiträge: 584
Crashbulle befindet sich auf einem aufstrebenden Ast
Crashbulle eine Nachricht über MSN schicken Crashbulle eine Nachricht über Skype™ schicken
Standard

Vielleicht hilft dies:

(.zip diente nur zum Hochladen)
Angehängte Dateien
Dateityp: zip Error Codes für MT4.html.zip (39,8 KB, 3x aufgerufen)
Dateityp: zip Error Codes für MT4.odt.zip (21,3 KB, 5x aufgerufen)
__________________
Was hoch aufsteigt, fällt tief herunter
Portfolio
Portfolio_1
  #6 (permalink)  
Alt 28.01.16
Benutzerbild von trololotromberino
Mitglied
 
Registriert seit: Jul 2015
Beiträge: 56
trololotromberino befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Crashbulle Beitrag anzeigen
Vielleicht hilft dies:

(.zip diente nur zum Hochladen)
Danke, aber ich kann es irgendwie nicht öffnen. Auch wenn ich es umbenenne oder so.
Ich weiß, was der Fehlercode heißt, aber ich weiß nicht, was der Fehler an meinem Code ist. Nach Suche habe ich dann das Beschriebene mit *Point und NormalizeDouble gefunden, aber das hat nicht geholfen (zumindest so, wie ich es angewandt habe).

LG
__________________
Ich arbeite aktuell an einem eigenen EA und komme nicht weiter!
Wäre cool, wenn mir Coder ein wenig weiterhelfen könnten:
www.expert-advisor.com/etsbh
  #7 (permalink)  
Alt 29.01.16
Benutzerbild von Crashbulle
Elite Mitglied
 
Registriert seit: Sep 2011
Ort: Voreifel
Beiträge: 584
Crashbulle befindet sich auf einem aufstrebenden Ast
Crashbulle eine Nachricht über MSN schicken Crashbulle eine Nachricht über Skype™ schicken
Standard

Die Endung .odt ist von Open Office , ist Freeware !
Das andere müßte der direkte Brownser-Link sein.
__________________
Was hoch aufsteigt, fällt tief herunter
Portfolio
Portfolio_1
Thema geschlossen

Lesezeichen

Stichworte
mql4, order, orderabgabe, orderaufgabe, programmierung, programmierung metatrader


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 23:33 Uhr.



Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2017 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------