Skripte: Pending orders DOWN - Seite 3

 
Михаил Рымарь:

Hallo, das Skript ist wirklich toll und das einzige auf MQ5, aber ich würde gerne in meinem Arsenal das gleiche haben, aber mit einer Menge, sagen wir 1 oder 0,5.

Vielen Dank für Ihre Arbeit und frohe Feiertage.

In dieser Serie war ursprünglich die Idee, die Mindestmenge zu verwenden. Daher für jetzt nur so weit.

 
Hallo Herr. Können Sie mir ein wenig helfen. Wie kann ich den Code an meine gewünschte Losgröße anpassen. Ich habe versucht, mehrere Zeit durch die Änderung der inplots: 5 aber immer noch die Lots Wert, wenn ich es ausführen, werden 0,01, ich bin Neuling, hopefull gibt es einen Weg für mich, es zu ändern. Dankeschön
//+------------------------------------------------------------------+
//|Schwebende Aufträge DOWN.mq5 |
//|Copyright © 2017, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2017, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.002"
#property description "The script sets the pending orders down from the price"
#property script_show_inputs
//---
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>  
CTrade         m_trade;                      // Handelsobjekt
CSymbolInfo    m_symbol;                     // Symbol-Info-Objekt
//+------------------------------------------------------------------+
//| Aufzählung ausstehender Aufträge DOWN|
//+------------------------------------------------------------------+
enum ENUM_PENDING_ORDERS_DOWN
  {
   buy_limit         =0,   // Kaufgrenze
   sell_stop         =3    // Verkaufsstopp
  };
//--- Eingabeparameter
input ushort                     InpDownGep        = 10;             // Gap für schwebende Aufträge DOWN vom aktuellen Preis (in Pips)
input ushort                     InpDownStep       = 3;             // Schritt zwischen den Aufträgen DOWN (in Pips)
input ENUM_PENDING_ORDERS_DOWN   InpDownOrders     = buy_limit;      // Art der ausstehenden Aufträge DOWN
input uchar                      InpDownQuantity   = 33;              // Menge DOWN
input double                     InpLots           = 5;            // Lose
input ushort                     InpStopLoss       = 100;             // Stop Loss (in Pips)
input ushort                     InpTakeProfit     = 100;             // Gewinnmitnahme (in Pips)
//---
ulong                            m_slippage=1;                      // Schlupf
double                           m_adjusted_point;                   // Punktwert angepasst für 3 oder 5 Punkte
double                           ExtDownGep=0.0;
double                           ExtDownStep=0.0;
double                           ExtStopLoss=0.0;
double                           ExtTakeProfit=0.0;
//+------------------------------------------------------------------+
//| Skript-Programmstartfunktion|
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   if(InpLots<=0.0)
     {
      Print("The \"Lots\" can't be smaller or equal to zero");
      return;
     }
//---
   if(!m_symbol.Name(Symbol())) // setzt den Symbolnamen
      return;
   if(!RefreshRates())
      return;

   string err_text="";
   if(!CheckVolumeValue(InpLots,err_text))
     {
      Print(err_text);
      return;
     }
//---
   if(IsFillingTypeAllowed(SYMBOL_FILLING_FOK))
      m_trade.SetTypeFilling(ORDER_FILLING_FOK);
   else if(IsFillingTypeAllowed(SYMBOL_FILLING_IOC))
      m_trade.SetTypeFilling(ORDER_FILLING_IOC);
   else
      m_trade.SetTypeFilling(ORDER_FILLING_RETURN);
//---
   m_trade.SetDeviationInPoints(m_slippage);
   m_trade.SetAsyncMode(true);
//--- Abstimmung für 3 oder 5 Ziffern
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtDownGep     = m_adjusted_point * InpDownGep;
   ExtDownStep    = m_adjusted_point * InpDownStep;
   ExtStopLoss    = m_adjusted_point * InpStopLoss;
   ExtTakeProfit  = m_adjusted_point * InpTakeProfit;
//--- Arbeit beginnen
   double start_price_ask=m_symbol.Ask()-ExtDownGep;
   double start_price_bid=m_symbol.Bid()-ExtDownGep;
//--- schwebende Aufträge DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMax(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }
//+------------------------------------------------------------------+
//| Aktualisiert die Daten der Symbolzitate|
//+------------------------------------------------------------------+
bool RefreshRates()
  {
//--- Aktualisierungsraten
   if(!m_symbol.RefreshRates())
      return(false);
//--- Schutz gegen den Rückgabewert "Null"
   if(m_symbol.Ask()==0 || m_symbol.Bid()==0)
      return(false);
//---
   return(true);
  }
//+------------------------------------------------------------------+
//| Überprüfung der Korrektheit des Auftragsvolumens
//+------------------------------------------------------------------+
bool CheckVolumeValue(double volume,string &error_description)
  {
//--- minimal zulässiges Volumen für Handelsgeschäfte
   double min_volume=m_symbol.LotsMin();
   if(volume<min_volume)
     {
      error_description=StringFormat("Volume is less than the minimal allowed SYMBOL_VOLUME_MIN=%.2f",min_volume);
      return(false);
     }

//--- maximal zulässiges Volumen von Handelsgeschäften
   double max_volume=m_symbol.LotsMax();
   if(volume>max_volume)
     {
      error_description=StringFormat("Volume is greater than the maximal allowed SYMBOL_VOLUME_MAX=%.2f",max_volume);
      return(false);
     }

//--- Minimaler Schritt der Volumenänderung
   double volume_step=m_symbol.LotsStep();

   int ratio=(int)MathRound(volume/volume_step);
   if(MathAbs(ratio*volume_step-volume)>0.0000001)
     {
      error_description=StringFormat("Volume is not a multiple of the minimal step SYMBOL_VOLUME_STEP=%.2f, the closest correct volume is %.2f",
                                     volume_step,ratio*volume_step);
      return(false);
     }
   error_description="Correct volume value";
   return(true);
  }
//+------------------------------------------------------------------+ 
//| Prüft, ob der angegebene Füllmodus erlaubt ist | 
//+------------------------------------------------------------------+ 
bool IsFillingTypeAllowed(int fill_type)
  {
//--- Ermitteln des Werts der Eigenschaft, die die zulässigen Füllmodi beschreibt 
   int filling=m_symbol.TradeFillFlags();
//--- Rückgabe von true, wenn Modus fill_type erlaubt ist 
   return((filling & fill_type)==fill_type);
  }
//+------------------------------------------------------------------+

 
Mjame116 :
Hallo Herr. Können Sie mir ein wenig helfen. Wie kann ich den Code an meine gewünschte Losgröße anpassen. Ich habe versucht, mehrere Zeit durch die Änderung der inplots: 5 aber immer noch die Lots Wert, wenn ich es ausführen, werden 0,01, ich bin Neuling, hopefull gibt es einen Weg für mich, es zu ändern. Vielen Dank

Es ist notwendig, anstelle des minimalen Lots den Eingabeparameter Lots zu setzen

//--- schwebende Aufträge DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }

dies zu tun:

//--- schwebende Aufträge DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(InpLots,m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(InpLots,m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
  }
 
Vladimir Karputov:

Es ist notwendig, anstelle der Mindestmenge den Eingabeparameter Lots

zu verwenden:

Vielen Dank, Sir, ich weiß es wirklich zu schätzen
 

Hallo, das Skript ist großartig und funktioniert gut.

Ich verwende dasselbe, um das Netz einzurichten, und ich möchte Sie fragen: Können Sie die beiden Skripte zu einem einzigen kombinieren? Ich meine ein Skript, das sowohl Aufwärts- als auch Abwärts-Order-Netze zur gleichen Zeit platzieren würde, mit den gleichen Parametern für lange und kurze Netze.

 
mason_one:

Hallo, das Skript ist toll und funktioniert einwandfrei.

Ich verwende dasselbe, um das Netz einzurichten, und ich möchte Sie fragen: Können Sie die beiden Skripte zu einem einzigen kombinieren? Ich meine ein Skript, das sowohl Aufwärts- als auch Abwärts-Order-Netze zur gleichen Zeit platzieren würde, mit den gleichen Parametern für lange und kurze Netze.

Ich danke Ihnen für Ihr Interesse. Ich veröffentliche ein Skript (kein Expert Advisor), das ein Netz von Pending Orders sowohl nach oben als auch nach unten setzt - Pending Orders UP DOWN.

 
Hallo Vladimir, sehr interessant Ihr Skript. funktioniert sehr gut, aber ich hoffe, Sie können mir helfen, indem Sie mir sagen, wie man die lotaje von 0,01 bis 0,03 ändern. Ich bleibe aufmerksam und im Voraus danken Ihnen sehr viel mein Freund.
 
Carlos Devia :
Hallo Vladimir, sehr interessant Ihr Skript. funktioniert sehr gut, aber ich hoffe, Sie können mir helfen, indem Sie mir sagen, wie man die lotaje von 0,01 bis 0,03 ändern. Ich bleibe aufmerksam und danke Ihnen sehr viel im Voraus mein Freund.

In diesem Code, anstelle von"m_symbol.LotsMin()" setzen"InpLots":

//--- schwebende Aufträge DOWN
   for(int i=0;i<InpDownQuantity;i++)
     {
      double price_ask     = start_price_ask-i*ExtDownStep;
      double price_bid     = start_price_bid-i*ExtDownStep;
      if(InpDownOrders==buy_limit)
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_ask - ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_ask + ExtTakeProfit;
         m_trade.BuyLimit(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_ask),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
      else
        {
         double sl         = (ExtStopLoss==0.0)   ? 0.0 : price_bid + ExtStopLoss;
         double tp         = (ExtTakeProfit==0.0) ? 0.0 : price_bid - ExtTakeProfit;
         m_trade.SellStop(m_symbol.LotsMin(),m_symbol.NormalizePrice(price_bid),m_symbol.Name(),
                          m_symbol.NormalizePrice(sl),
                          m_symbol.NormalizePrice(tp));
        }
     }
 

Lieber Vladimir, in diesem Moment bist du für mich wie ein Gott. Du weißt nicht, wie sehr ich danach gesucht habe. Ich weiß es wirklich zu schätzen, dass du dir die Zeit genommen hast, mir zu antworten. Ich bin ein Mensch, der sich leidenschaftlich für den Handel interessiert, und das wenige, was ich weiß, habe ich von Leuten wie dir gelernt.

Ich möchte Ihnen eine letzte Frage stellen, wenn das möglich ist. Ich habe einen Hotkey auf meiner Tastatur programmiert

Ich habe einen Hotkey auf meiner Tastatur programmiert, um meinen Verkaufsstoppauftrag zu aktivieren, aber bevor er aktiviert wird, öffnet sich ein Fenster, von dem ich möchte, dass es sich nicht öffnet, sondern dass mein Auftrag sofort ausgeführt wird.

Ich füge ein Bild des sich öffnenden Fensters bei.

Ich wäre Ihnen dankbar, wenn Sie Vladimir helfen könnten, damit dieses Fenster nicht erscheint, denn wenn es sich öffnet, muss ich die Parameter"akzeptieren", und dabei verliere ich Zeit.

Dateien:
 
Carlos Devia :

Lieber Vladimir, in diesem Moment bist du für mich wie ein Gott. Du weißt nicht, wie sehr ich danach gesucht habe. Ich weiß es wirklich zu schätzen, dass du dir die Zeit genommen hast, mir zu antworten. Ich bin ein Mensch, der sich leidenschaftlich für den Handel interessiert, und das wenige, was ich weiß, habe ich von Leuten wie dir gelernt.

Wenn möglich, möchte ich Ihnen eine letzte Frage stellen: Ich habe einen Hotkey auf meiner Tastatur programmiert.

Ich habe einen Hotkey auf meiner Tastatur programmiert, um meinen Verkaufsstoppauftrag zu aktivieren, aber bevor er aktiviert wird, öffnet sich ein Fenster, das ich nicht öffnen möchte, sondern einfach meinen Auftrag sofort ausführen möchte.

Ich füge ein Bild des sich öffnenden Fensters bei.

Ich wäre Ihnen dankbar, wenn Sie Vladimir helfen könnten, damit dieses Fenster nicht erscheint, denn wenn es sich öffnet, muss ich die Parameter "akzeptieren", und dabei verliere ich Zeit.

Ein Hotkey ist keine Option: beim Start sind die Eingabeparameter ohnehin sichtbar.

Ich würde einen anderen Weg vorschlagen:

  • Schreiben Sie einen Berater - ein Panel, im Panel hat alles einen "Start"-Button.
  • Wenn Sie den Berater starten, stellen Sie einmal die Eingabeparameter ein
  • Nach dem Start wird ein kleines Panel auf dem Chart angezeigt: Wenn Sie auf die Schaltfläche "Start" auf diesem Panel klicken, werden die ausstehenden Aufträge platziert (alle Parameter werden von den Eingabeparametern übernommen.

Beispiel-Panel:



Sie können nach einem solchen Panel im Market suchen oder es über den Freelance-Service bestellen.