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)
-   -   Eigene Funktion für Orderaufgabe (http://www.expert-advisor.com/forum/showthread.php?t=4703)

trololotromberino 22.01.16 16:08

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

traderdoc 22.01.16 16:37

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

trololotromberino 25.01.16 23:04

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.....

trololotromberino 28.01.16 18:56

Liste der Anhänge anzeigen (Anzahl: 1)
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

Crashbulle 28.01.16 20:31

Liste der Anhänge anzeigen (Anzahl: 2)
Vielleicht hilft dies:

(.zip diente nur zum Hochladen)

trololotromberino 28.01.16 21:37

Zitat:

Zitat von Crashbulle (Beitrag 32761)
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

Crashbulle 29.01.16 12:43

Die Endung .odt ist von Open Office , ist Freeware !
Das andere müßte der direkte Brownser-Link sein.


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