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

 
Motzaart:

Nachmittags.

In einem Expert Advisor mit mehreren Währungen muss ich eine Pending Order schließen, die gegen einen Gewinn platziert wurde, wenn eine offene Position ausgelöst wird.

Wenn ich jetzt einen schwebenden Auftrag mit Gewinn schließe, werden alle schwebenden Aufträge für alle Währungen geschlossen.

Wie kann man den Code so ändern, dass nur der schwebende Auftrag, der sich auf ein Währungspaar bezieht, geschlossen wird und der Rest offen bleibt?

Was sollte ich an diesem Code ändern?

Mn in diesem Code ist eine magische Zahl für einen schwebenden Auftrag BUY_STOP oder SELL_STOP.

Die Logik ist, dass wenn eine offene Position mit Take Profit geschlossen wird, diese magische Zahl übrig bleibt und der Befehl zum Löschen ausgeführt werden soll.

Dies funktioniert beim Testen jedes Paares. Wenn Sie jedoch mit anderen Währungen arbeiten, werden alle für alle Paare erteilten Aufträge gelöscht.

Bitte helfen Sie, wer kann es tun.

Ich verstehe, dass sich niemand mit diesem Problem befassen sollte, aber vielleicht hat jemand eine fertige Vorlage?

Dafür wäre ich sehr dankbar.

Ich musste den Code in den Editor kopieren und eine normale Formatierung vornehmen (Strg+<), um zu verstehen, was Sie da verbockt haben.

Also: Ich habe in den Code kommentiert, was dort durcheinander geraten ist:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

Infolgedessen tut Ihr Code dies, d. h. er entspricht diesem Code:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

Fragen Sie sich nun: Was wollten Sie damit erreichen?

 
Artyom Trishkin:

Um zu verstehen, was du da verbockt hast, musste ich den Code in den Editor kopieren und eine richtige Formatierung vornehmen (Strg+<).

Also: in den Code kommentiert, was du da verbockt hast:

Infolgedessen tut Ihr Code dies, d. h. er entspricht diesem Code:

Fragen Sie sich nun: Was wollten Sie damit erreichen?

GUT.

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

hier:

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

Wenn eine Position eröffnet wird (OP_BUY oder OP_SELL ), platzieren wir gleichzeitig schwebende Aufträge (OP_SELLSTOP und OP_BUYSTOP).

Bei der Schließung einer offenen Position mit Gewinnmitnahme muss der zugehörige schwebende Auftrag storniert werden. Dieser Algorithmus wird auf alle Währungspaare angewendet.

Andere schwebende Aufträge, die auf andere Währungen lauten, sollten bestehen bleiben.

 

Einen guten Tag an Sie alle!

Es gibt einen Indikator MTF_RSI schaltet sich

input ENUM_TIMEFRAMES      TimeFrame   =  0;

Können Sie mir sagen, ob es möglich ist, einen automatischen Wechsel des TimeFrame beim Wechsel des Charts einzustellen?

Etwas wie

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

Einen guten Tag an Sie alle!

Es gibt einen Indikator MTF_RSI schaltet

Können Sie mir sagen, ob es möglich ist, einen automatischen Wechsel des TimeFrame beim Wechsel des Charts einzustellen?

Etwa so

Erstellen Sie eine Struktur oder ein mehrdimensionales Array und lassen Sie es auf der gewünschten Dimension laufen, wenn das Kriterium erfüllt ist, arbeiten Sie mit einer Spalte (jede Spalte ist für ihren eigenen Zeitrahmen zuständig), wenn nicht, mit einer anderen Spalte, und das ist alles. Das Programm selbst kann auf alle Zeiträume gleichzeitig zugreifen, so dass das, was Sie schreiben, möglich ist, aber die Implementierung ist sehr umfangreich, und man kann diesen Arbeitsaufwand im Forum nicht sehen, weil er sehr umfangreich ist.

 
Seric29:

Erstellen einer Struktur oder eines mehrdimensionalen Arrays

Ich danke Ihnen.

 

Warum funktioniert dieser Code nicht?

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

Es funktioniert mit einfachen Funktionen, aber es ist etwas seltsam.

 
MakarFX:

Ich danke Ihnen.

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
Sprechen Sie mit mir?
 
MakarFX:
Sprechen Sie mit mir?

Ja zu Ihnen. Sie müssen das Spiel mit Zeitvorgaben für jedes Detail in jeder Schleife und in jeder Funktion durcharbeiten. Aus diesem Grund empfehle ich die Verwendung mehrdimensionaler Arrays.

 
Seric29:

Ja zu Ihnen. Sie müssen das Spiel mit Zeitvorgaben für jedes Detail in jeder Schleife und in jeder Funktion durcharbeiten. Aus diesem Grund empfehle ich die Verwendung mehrdimensionaler Arrays.

Dieses Problem ist einfacher zu lösen:

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }