Fragen von Neueinsteigern zu MQL4 und MQL5, Hilfe und Diskussion über Algorithmen und Codes - Seite 31

 
Vitalie Postolache:
Der Fehler liegt irgendwo weiter oben im Code, im Bereich der Auftragsauswahl.
Den Rest rühre ich nicht an.
 
spoiltboy:
Den Rest rühre ich nicht an.
In jedem Fall müssen Sie den vorangehenden und den nachfolgenden Code sehen, nicht nur die Bedingungszeilen.
 
Artyom Trishkin:
In jedem Fall müssen Sie den vorangehenden und den nachfolgenden Code sehen, nicht nur die Bedingungszeilen.
extern int pointsl=100, pointtp=100, MagicB=111111, MagicS=2222, bars=10; extern double lotB=0.1, lotS=0.1;
double slB, tpB, slS, tpS; double x=0, z=0;


void OnTick()
{
double maxpr1=9999; double minpr1=9999;

for(int shift1=0; shift1<bars; shift1++)
{double i=iHigh(Symbol(), PERIOD_CURRENT, shift1);
if (i>maxpr1){maxpr1=i;}}

for(int shiftA1=0; shiftA1<bars; shiftA1++)
{double y=iLow(Symbol(), PERIOD_CURRENT, shiftA1);
if (y<minpr1) {minpr1=y;}}

if (BuyLimitCount()==0 && BuyCount()==0){
slB=NormalizeDouble(minpr1-pointsl*Point,5);
tpB=NormalizeDouble(minpr1+pointsl*Point,5);
int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minpr1, 3, slB, tpB, "", MagicB, 0, Red);
if (ticketUP==-1) Print("ERROR OP_BUY"); else Print("OP_BUY OK");}

if (SellLimitCount()==0 && SellCount() ==0){
slS=NormalizeDouble(maxpr1+pointsl*Point,5);
tpS=NormalizeDouble(maxpr1+pointsl*Point,5);
int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxpr1, 3, slS, tpS, "", MagicS, 0, Blue);
if (ticketD==-1) Print("ERROR OP_SELL"); else Print("OP_SELL OK");}

if (x!=maxpr1){x=maxpr1; OrderDelete(ticketD);}
if (z!=minpr1){z=minpr1; OrderDelete(ticketUP);}


double maxpr=-9999; double minpr=9999;

for(int shift=0; shift<bars; shift++)
{double e=iHigh(Symbol(), PERIOD_CURRENT, shift);
if (e>maxpr){maxpr=e;}}

for(int shiftA=0; shiftA<bars; shiftA++)
{double r=iLow(Symbol(), PERIOD_CURRENT, shiftA);
if (r<minpr) {minpr=r;}}

Zeichenfolge a;
if(bars==1)a="bar:";
else a= IntegerToString(bars,1) + " bars: ";
Comment("Last ", a, "max ", DoubleToStr(maxpr, 5), ", min ", DoubleToStr(minpr, 5),";
}

int BuyLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(Auftragsart()==OP_BUYLIMIT)
count++;}}return(count);}

int BuyCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicB){
if(Auftragsart()==OP_BUY)
count++;}}}return(count);}

int SellLimitCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(Auftragsart()==OP_SELLLIMIT)
count++;}}}return(count);}

int SellCount(){
int count=0;
for(int i=OrdersTotal()-1; i>=0; i--){
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)==true){
if(OrderMagicNumber()==MagicS){
if(OrderType()==OP_SELL)
count++;}}}return(count);}
 
spoiltboy:
...
Und überhaupt, was wollen Sie mit diesem, Entschuldigung, gruseligen Code erreichen?
 
spoiltboy:

Möchten Sie den Code bereinigen und ihn richtig einfügen, indem Sie den SRC verwenden?

Warum wenden Sie OrderSelect nicht an, bevor Sie versuchen zu löschen?

 
spoiltboy:
...

Ich weiß nicht, warum Sie dort so viele Schleifen benötigen, wenn Sie die erforderlichen Strukturfelder über die Anzahl der Aufträge und Positionen in einer einzigen ausfüllen können.

Ich habe unnötige Dinge entfernt, und ich habe auch die Löschung entfernt. Sie brauchen nicht nach Ticket zu löschen (Sie müssen es vor dem Löschen immer noch wissen), sondern in der Schleife die richtige Reihenfolge nach Index zu finden und sie zu löschen.

Wir brauchen also eine weitere Funktion zum Suchen und Löschen von Aufträgen, die im Falle einer Bedingung aufgerufen werden sollte, aber welche Art von Bedingung - das habe ich nicht sofort verstanden, als ich mir Ihren Code ansah, und ich hatte keine Zeit, ihn durchzusehen. Beschreiben Sie die notwendigen Bedingungen in Worten und wir sagen Ihnen, wie Sie löschen können.

Ich hatte es selbst geschrieben, ohne nachzusehen, daher kann es Fehler in der Funktion geben, die die Struktur mit der Anzahl der Aufträge und Positionen füllt - ich habe es nicht überprüft.

//--- input variables
input    double   LotB=0.1;      // Лот Buy
input    double   LotS=0.1;      // Лот Sell
input    int      Pointsl=100;   // StopLoss в пунктах
input    int      Pointtp=100;   // TakeProfit в пунктах
input    int      NumBars=10;    // Количество баров для поиска Max/Min
input    int      Magic=100500;  // Magic

//--- global variables
struct DataNumOrders
  {
   int buy;          // Количество позиций Buy
   int sell;         // Количество позиций Sell
   int buy_limit;    // Количество ордеров BuyLimit
   int buy_stop;     // Количество ордеров BuyStop
   int sell_limit;   // Количество ордеров SellLimit
   int sell_stop;    // Количество ордеров SellStop
  };
DataNumOrders numOrders;   // Количество ордеров
double lotB, lotS;
int    pointsl, pointtp, numBars;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   numBars=(NumBars<1?1:NumBars>Bars?Bars:NumBars);
   pointsl=(Pointsl<0?0:Pointsl);
   pointtp=(Pointtp<0?0:Pointtp);
   double minLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN);
   double maxLot=SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MAX);
   lotB=(LotB<minLot?minLot:LotB>maxLot?maxLot:LotB);
   lotS=(LotS<minLot?minLot:LotS>maxLot?maxLot:LotS);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   //--- заполним структуру количеством ордеров и позиций
   GetNumOrders(Symbol(),Magic,numOrders);
  
   //--- найдём максимальную и минимальную цены за bars свечей
   double maxPrice=0.0; double minPrice=DBL_MAX;
   for(int i=0; i<numBars; i++) {
      double max_i=iHigh(Symbol(),PERIOD_CURRENT,i);
      if(max_i>maxPrice) maxPrice=max_i;
      double min_i=iLow(Symbol(),PERIOD_CURRENT,i);
      if(min_i<minPrice) minPrice=min_i;
      }

   //--- выставим BuyLimit
   if(numOrders.buy_limit==0 && numOrders.buy==0) {
      double slB=(pointsl==0?0:NormalizeDouble(minPrice-pointsl*Point(),Digits()));
      double tpB=(pointtp==0?0:NormalizeDouble(minPrice+pointtp*Point(),Digits()));
      int ticketUP=OrderSend(Symbol(), OP_BUYLIMIT, lotB, minPrice, 3, slB, tpB, "", Magic, 0, clrRed);
      if(ticketUP==-1) Print("ERROR OP_BUY");
      else Print("OP_BUY OK");
      }
   //--- выставим SellLimit
   if(numOrders.buy_limit==0 && numOrders.sell==0) {
      double slS=(pointsl==0?0:NormalizeDouble(maxPrice+pointsl*Point(),Digits()));
      double tpS=(pointtp==0?0:NormalizeDouble(maxPrice-pointtp*Point(),Digits()));
      int ticketD=OrderSend(Symbol(), OP_SELLLIMIT, lotS, maxPrice, 3, slS, tpS, "", Magic, 0, clrBlue);
      if(ticketD==-1) Print("ERROR OP_SELL");
      else Print("OP_SELL OK");
      }

   //--- Тут должно быть удаление, но не понятно при каких условиях. Опишите их
  
  
   //---
   string a=(numBars==1)?"bar: ":IntegerToString(numBars,1)+" bar's: ";
   Comment("Last ", a, "max ", DoubleToStr(maxPrice, Digits()), ", min ", DoubleToStr(minPrice, Digits()),".");
  }
//+------------------------------------------------------------------+
//| Записывает в структуру количество позиций и отложенных ордеров   |
//+------------------------------------------------------------------+
void GetNumOrders(string symbol_name, int magic_number, DataNumOrders &number_of) {
   ZeroMemory(number_of);
   for(int i=OrdersTotal()-1; i>=0; i--) {
      if(OrderSelect(i,SELECT_BY_POS)) {
         if(OrderMagicNumber()!=magic_number) continue;
         if(OrderSymbol()!=symbol_name)       continue;
         if(OrderType()==OP_BUY)       number_of.buy++;
         if(OrderType()==OP_BUYLIMIT)  number_of.buy_limit++;
         if(OrderType()==OP_BUYSTOP)   number_of.buy_stop++;
         if(OrderType()==OP_SELL)      number_of.sell++;
         if(OrderType()==OP_SELLLIMIT) number_of.sell_limit++;
         if(OrderType()==OP_SELLSTOP)  number_of.sell_stop++;
         }
      }
}
//+------------------------------------------------------------------+
 
Artyom Trishkin:
Was wollen Sie generell mit diesem, Entschuldigung, gruseligen Code erreichen?
Der EA zählt die Minimal- und Maximalwerte der letzten X Bars und platziert darauf Orders. Wenn dann der Höchst- oder Tiefststand sinkt oder steigt, müssen wir den Auftrag löschen und mit den neuen Daten eröffnen.


 

wie man das Folgende schreibt:

Wenn sich der Kurs um 1% verändert hat, z.B. am OPEN-Tag um 1% mehr als am Slose-Tag

 
Movlat Baghiyev:

wie man das Folgende schreibt:

Wenn sich der Kurs um 1 % verändert hat, ist der OPEN-Tag beispielsweise um 1 % größer als der Close-Tag.

Das ist etwas anderes, jetzt ist klar, worauf sich die 1% beziehen ;)

if(Open[x] > Close[x]+Open[x]*0.01) {code}
 
spoiltboy:
Der Expert Advisor zählt die Minimal- und Maximalwerte der letzten X Bars und platziert die Orders nach diesen Werten. Wenn es eine Verringerung des Maximums oder eine Erhöhung des Minimums gibt, müssen Sie den entsprechenden Auftrag löschen und ihn mit den neuen Daten öffnen.


Warum sollten Sie löschen, wenn Sie den festgesetzten Preis und den Stop und Takeout relativ zum neuen Niveau ändern können? Schließlich geben Sie nur dann schwebende Aufträge auf, wenn es keine schwebenden Aufträge und keine Marktpositionen gibt. Wenn also eine schwebende Order auf dem Markt ist und es keine entsprechende Marktposition gibt, dann müssen wir nur die Preise der schwebenden Order ändern - den Set-Preis auf ein neues Niveau und die Stop-Order auf das neue Niveau.

Sie müssen sich jedes Mal die gefundenen Preise von Max und Min merken. Wenn der aktuell gefundene Preis von Max niedriger ist als der vorherige, ändern wir das ausstehende BuyLimit und speichern den neuen Preis von Max. Für Min Preis, Spiegel es.