Ctrade - Seite 3

 

Dieser Artikel handelt genau um diese Klassen.


Amando hier musst du dich reinlesen.


https://www.mql5.com/de/articles/138

Der Einsatz von MQL5 Standard Library Handelsklassen beim Schreiben eines Expert Advisors
Der Einsatz von MQL5 Standard Library Handelsklassen beim Schreiben eines Expert Advisors
  • www.mql5.com
Das neue MQL5 Programm besitzt eine Menge eingebauter Standardklassen-Libraries, mit deren Hilfe Trader und Entwickler MQL5 Expert Advisors, Indikatoren und Skripts sehr leicht weiterentwickeln können. Dieser Beitrag beschreibt en detail wie man die eingebauten Handelsklassen zum Schreiben eines Expert Advisors verwenden kann. Der Expert...
 

so jetzt versteh ich gar nix mehr, ich hab gerade ein Script gebaut, das genau die Funktion macht, sind ja nur 3 Zeilen


#property copyright "Copyright 2018, "
#property link      ""
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>             CTrade _trade;   

input int diff = 200;


void OnStart()
  {

   MqlTick tick;                                               // nur gültig für das aktuelle Symbol
   if(!SymbolInfoTick(Symbol(),tick)) GetLastError();
   
   _trade.BuyStop(0.01,tick.bid + diff*_Point,_Symbol,0,0,ORDER_TIME_GTC,0,"Comment");
   
   Print("Retcode: ",_trade.ResultRetcode(), " OrderNummer: ", _trade.ResultOrder());
   
  }

als Ergebnis bekomme ich



also ich bekomme alles zurück,


so jetzt gehe ich in den EA, eigentlich auch nix dramatisches,

und hab da die Funktion

void OrderBuy(const MqlTick &tick)
  {
  
   double SL1=0,TP1=0;
   double SL_Neu=0,TP_Neu=0,_price=0,StopPips=0;
   double FindStop=0;

// Risikoart bestimmen
   if(RisikoLotState==true) Risikoart=FixLots;
   else if(RisikoGeldState==true) Risikoart=Geldbetrag;
   else if(RisikoProzentState==true) Risikoart=Prozent;

   if(ObjectFind(0,"SLBuyTrendLine"+_Symbol)>=0) {SL_Neu=ObjectGetValueByTime(0,"SLBuyTrendLine"+_Symbol,TimeCurrent(),0);}
   else SL_Neu=0;

   if(ObjectFind(0,"TPBuyTrendLine"+_Symbol)==0) {TP_Neu=ObjectGetValueByTime(0,"TPBuyTrendLine"+_Symbol,TimeCurrent(),0);}
   else TP_Neu=0;

   double _priceBuy=ObjectGetValueByTime(0,"BuyTrendLine"+_Symbol,TimeCurrent(),0);

   double SLPips=0;
   if(ObjectFind(0,"SLBuyTrendLine"+_Symbol)>=0) SLPips=MathPow(10,_Digits)*MathAbs(ObjectGetDouble(0,"BuyTrendLine"+_Symbol,OBJPROP_PRICE,0)-ObjectGetDouble(0,"SLBuyTrendLine"+_Symbol,OBJPROP_PRICE,0));
   else SLPips=StringToDouble(ObjectGetString(0,"SL",OBJPROP_TEXT,0));

   if(RisikoLotState)
      Lots=RisikoberechnungPanel(_Symbol,StringToDouble(ObjectGetString(0,"LotSize",OBJPROP_TEXT,0)),SL_Neu,Risikoart,tick);
   else
      Lots=RisikoberechnungPanel(_Symbol,StringToDouble(ObjectGetString(0,"LotSize",OBJPROP_TEXT,0)),SLPips,Risikoart,tick);

   if(ObjectFind(0,"BuyTrendLine"+_Symbol)>=0)
     {

      if(tick.ask<_priceBuy)
        {
        Print("Buy Stop setzten");
        // PendingOpen(_Symbol,ORDER_TYPE_BUY_STOP,Lots,_priceBuy,SL_Neu,TP_Neu,MN,"BuyStopTrendLine "+_Symbol,0);
         _trade.BuyStop(0.01,tick.bid + 200*_Point,_Symbol,0,0,ORDER_TIME_GTC,0,"Comment");
        // _trade.BuyStop(Lots,_priceBuy,_Symbol,SL_Neu,TP_Neu,ORDER_TIME_GTC,0,"BuyTrendLine "+_Symbol);
            Print("ticket ",_trade.ResultOrder()," Price: ",_trade.ResultPrice()," Volume: ",_trade.ResultVolume());
            Print("Retcode: ",_trade.ResultRetcode(), " OrderNummer: ", _trade.ResultOrder());
        }

      if(tick.ask>=_priceBuy)
        {
         if(!_trade.BuyLimit(Lots,_priceBuy,_Symbol,SL_Neu,TP_Neu,ORDER_TIME_GTC,0,Text+"BuyLimitTrend "+_Symbol))
            Print(_trade.ResultRetcode()," ",_trade.ResultRetcodeDescription());
         else
            Print(_trade.ResultOrder(), " ",_trade.ResultRetcode(), " ",_trade.ResultRetcodeDescription()," ", _trade.ResultDeal(), " ", _trade.ResultAsk() );

               
        }
     }
  }

eigentlich genau der gleiche Code bei Buy Stop


dann bekomme ich als Ergebnis


also die Order ist da, ich bekomme den Retcode zurück, aber keine weiteren daten, obwohl die Funktion die gleiche ist,

jetzt bin ich her und hab die Funktion eigentlich um alles gekürzt, so das da nur noch

void OrderBuy(const MqlTick &tick)
  {
  
        Print("Buy Stop setzten");
        // PendingOpen(_Symbol,ORDER_TYPE_BUY_STOP,Lots,_priceBuy,SL_Neu,TP_Neu,MN,"BuyStopTrendLine "+_Symbol,0);
         _trade.BuyStop(0.01,tick.bid + 200*_Point,_Symbol,0,0,ORDER_TIME_GTC,0,"Comment");
        // _trade.BuyStop(Lots,_priceBuy,_Symbol,SL_Neu,TP_Neu,ORDER_TIME_GTC,0,"BuyTrendLine "+_Symbol);
            Print("ticket ",_trade.ResultOrder()," Price: ",_trade.ResultPrice()," Volume: ",_trade.ResultVolume());
            Print("Retcode: ",_trade.ResultRetcode(), " OrderNummer: ", _trade.ResultOrder());
   
  }

und das Ergebnis, 

wieder mit Order


die funktion OrderBuy rufe ich über die OnChartEvent mittels Button auf


ich seh da einfach keinen Fehler im Code,

ich hab auch schon probiert, aus der Void eine Ulong zu machen, damit ich die Order Nummer als Ergebnis zurück bekomme, ebenfalls 0

 

Returncode 10008 istz aber nicht 10009 !

Obwohl da steht "PLACED" .

Bedeutet für mich das die Order vom Server akzeptiert wurde aber noch nicht am Markt ist.


Setz mal eine kleine Puse danach rein , nur so zum Test.

300 ms vielleicht.


Ich teste gleich mal selber dein Skript

 
Das hier
//|                                      Forum_amando_CTrade_001.mq5 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>          

CTrade _trade;
   
void OnStart()
  {
   MqlTick tick;                                               // nur gültig für das aktuelle Symbol
   if(!SymbolInfoTick(Symbol(),tick)) GetLastError();
   
   OrderBuy(tick);
   
   
  }
//+------------------------------------------------------------------+
void OrderBuy(const MqlTick &tick)
  {
  
        Print("Buy Stop setzten");
        // PendingOpen(_Symbol,ORDER_TYPE_BUY_STOP,Lots,_priceBuy,SL_Neu,TP_Neu,MN,"BuyStopTrendLine "+_Symbol,0);
         _trade.BuyStop(0.01,tick.bid + 200*_Point,_Symbol,0,0,ORDER_TIME_GTC,0,"Comment");
        // _trade.BuyStop(Lots,_priceBuy,_Symbol,SL_Neu,TP_Neu,ORDER_TIME_GTC,0,"BuyTrendLine "+_Symbol);
            Print("ticket ",_trade.ResultOrder()," Price: ",_trade.ResultPrice()," Volume: ",_trade.ResultVolume());
            Print("Retcode: ",_trade.ResultRetcode(), " OrderNummer: ", _trade.ResultOrder());
   
  }

liefert bei Robomarkets:




Zeig mal dein LOG
 

da versteh einer die Welt,

also ich hab jetzt nach dem Order setzten einen Sleep(1000); reingegeben, gleiches Ergebnis, es bleibt bei Retcode 10008. Mir ist das ja noch nie aufgefallen, da ich ja den Trade sehe, scheinbar ist da die Order nur platziert aber noch nicht eingestellt.

dann hab ich schnell mal eine Pending Order geschrieben

ulong PendingOpen(const string symbol,const ENUM_ORDER_TYPE order_type,const double volume,
                  const double OrderPrice,const double sl,const double tp,const int magic,
                  const string comment,const datetime expirationtime)
  {

   MqlTradeRequest neueOrder={0};
   MqlTradeResult result;
//--- setting request
   neueOrder.symbol       = symbol;
   neueOrder.type         = order_type;
   neueOrder.action       = TRADE_ACTION_PENDING;
   neueOrder.type_filling = ORDER_FILLING_FOK;
   neueOrder.type_time    = ORDER_TIME_GTC;
   neueOrder.volume       = volume;
   neueOrder.price        = OrderPrice;
   neueOrder.sl           = sl;
   neueOrder.tp           = tp;
   neueOrder.magic        = magic;
   neueOrder.comment      = comment;
   neueOrder.expiration   = expirationtime;

//--- action and return the result
//return(OrderSendAsync(neueOrder,result));

   if(!OrderSend(neueOrder,result))
      PrintFormat("OrderSend error %d",GetLastError());  // wenn die Anfrage konnte nicht gesendet werden, den Fehlercode anzeigen
//--- Details zur Transaktion   
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);


Print(result.order);
   return(result.order);

  }


und mit dem Result gehts problemlos, da bekomme ich sofort die Order raus

 
amando:

da versteh einer die Welt,

also ich hab jetzt nach dem Order setzten einen Sleep(1000); reingegeben, gleiches Ergebnis, es bleibt bei Retcode 10008. Mir ist das ja noch nie aufgefallen, da ich ja den Trade sehe, scheinbar ist da die Order nur platziert aber noch nicht eingestellt.

dann hab ich schnell mal eine Pending Order geschrieben


und mit dem Result gehts problemlos, da bekomme ich sofort die Order raus

Du solltest doch mal mein skript bei DEINEM Broker testen.

 
Christian:

Du solltest doch mal mein skript bei DEINEM Broker testen.

das funktioniert @Christian 

 
amando:

das funktioniert @Christian 

Ok , das ist dann Part eins.

Falls du noch weiter möchtest brauche ich ein skript wo dein 10008 auftritt.

:-) ...komm schon

 
Christian:

Ok , das ist dann Part eins.

Falls du noch weiter möchtest brauche ich ein skript wo dein 10008 auftritt.

:-) ...komm schon

Kommt nach dem we 😂

 
amando:

Kommt nach dem we 😂

Nagut :-;
Grund der Beschwerde: