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

 
Artyom Trishkin:

Ich verstehe, dass Sie dem Expert Advisor auf irgendeine Weise das Ticket der manuell eröffneten Position angeben müssen, das er durchsuchen soll.

  1. Sie sollten dem Expert Advisor die Verfolgung neu eröffneter Positionen hinzufügen, und wenn sie keine Magie haben, bedeutet das, dass sie manuell eröffnet wurden. Der Expert Advisor kennzeichnet die Eröffnung dieser Position mit dem Preis und dem Balken ihrer Eröffnung. Der Name des Objekts muss ein Präfix mit dem gemeinsamen Namen des Objekts für alle derartigen Objekte enthalten, z. B. "manual_", und das Ticket der Position muss ebenfalls vorhanden sein. Folglich kann der Name des Objekts wie folgt lauten: "Handbuch_12345678". Hier: manual_ - Präfix, 12345678 - Position Ticket.
  2. Fügen Sie dem Expert Advisor OnChartEvent() hinzu und überwachen Sie das Ereignis des Mausklicks auf das Objekt. Analysieren Sie den Namen des Objekts, und wenn er die Teilzeichenkette manual_ enthält, dann suchen Sie nach einer Zahl nach manual_. Diese Nummer ist das Ticket der Position, auf die Sie geklickt haben.
  3. Dann müssen Sie die gefundene Nummer speichern, damit sie nicht verloren geht, wenn Sie EA/Terminal/Computer/Welt neu starten... Zum Beispiel in Ressourcen oder globalen Variablen des Terminals.
  4. Der Expert Advisor sollte diese Ressource lesen und das Ticket für die zu durchsuchende Position aus ihr entnehmen
  5. Im Suchlauf sollten Sie das Ticket der ausgewählten Position abrufen und in der Liste der gespeicherten Tickets nach dieser Nummer suchen. Wenn ein solches Ticket gefunden wird, muss die Position mit diesem Ticket durchsucht werden.
  6. Wenn die Anzahl der Positionen geändert wird, muss das Ticket der geschlossenen Position geprüft und in der gespeicherten Liste gefunden werden. Wenn ein solches Ticket in der Liste vorhanden ist, muss es aus der Liste gelöscht werden - die Position existiert nicht mehr, und es gibt nichts, was mit dem Ticket in der Ticketliste für die Suche zu tun hat.
Etwa so. Die Logik wurde auf einer Kurbel geschrieben, so konnte nicht berücksichtigen, etwas...


Danke für die Klarstellung, jetzt verstehe ich, was ich meine.

Für mich mql Lektionen empfehlen, um 3 (EURUSD), aber die Liquidität der Währungen ist anders und so ist ihre Geschwindigkeit. Welche Zahlen können unter normalen Marktbedingungen als Richtwert für Dollar-Paare und -Crosses verwendet werden?

 
Ist es möglich, einen mehrdimensionalen Puffer mit CopyOpen, CopyHigh, CopyLow und CopyClose zu füllen? Die Beschreibung sagt, dass es in ein dynamisches Array kopiert - aber ein dynamisches Array kann mehrdimensional sein MQL5
 
Alexandr Sokolov:
Ist es möglich, einen mehrdimensionalen Puffer mit den Funktionen CopyOpen, CopyHigh, CopyLow und CopyClose zu füllen? Die Beschreibung sagt, dass es in ein dynamisches Array kopiert - aber ein dynamisches Array kann mehrdimensional sein MQL5

Verwenden Sie ein eindimensionales Array...

 
Alexandr Sokolov:
Ist es möglich, einen mehrdimensionalen Puffer mit den Funktionen CopyOpen, CopyHigh, CopyLow und CopyClose zu füllen? In der Beschreibung steht, dass in ein dynamisches Array kopiert wird - ein dynamisches Array kann jedoch mehrdimensional sein.

Wenn Sie Schwierigkeiten haben, die Strukturen zu verstehen, können Sie ArrayCopyRates verwenden

int  ArrayCopyRates( 
   void&     dest_array[][],    // массив, переданный по ссылке 
   string    symbol=NULL,       // инструмент 
   int       timeframe=0        // таймфрейм 
   );

Wenn Sie es gut verstehen, sollten Sie

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

Hallo. Ich habe versucht, einen EA aus mehreren zu erstellen. Im Strategietester funktioniert alles einwandfrei (ich habe es im Visualisierungsmodus überprüft). Ich habe versucht, ein Demokonto zu benutzen, und ab und zu habe ich das folgende Problem, eine Order wird eröffnet und dann gelöscht, und das geschieht während einer Stunde, bis die Stunde wechselt. Ich dachte, es gibt eine Bedingung für die Eingabe und das Löschen der Bestellung zur gleichen Zeit, aber die Löschung ist nur in der Zeit, löschte ich diesen gesamten Block Fehler ist nicht verschwunden. Wenn jemand nicht schwierig ist, sagen Sie mir, wo der Fehler.

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
      
   CurrHour = TimeHour(TimeCurrent());
   
   if (CloseByTime == true && DayOfWeek() == DayEnd && CurrHour >= CloseHour)
   {
      if (CountTrades() > 0 || CountStop() > 0) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek() && CurrHour == StartHour && ((!SetLimits && CountStop() == 0) || (SetLimits && CountLimits() == 0)) && CountTrades() == 0)
   {
      high = iHigh(Symbol(), 0, 1);
      low  = iLow(Symbol(), 0, 1);
      spread = MarketInfo(Symbol(),MODE_SPREAD);
      
      if ((high - low)/Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble(high + Indent*Point, Digits);
         sell = NormalizeDouble(low - Indent*Point, Digits);
        
      
         if (FixedLot > 0)
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true)
         {
            if (AccountBalance() < abalance) 
               Lots = getlotlast();
            else abalance = AccountBalance();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread*Point - TPP*Point);
            tp_buy  = ND(buy + spread*Point + TPP*Point);
         
            sl_sell = ND(sell + SLP*Point+spread*Point);
            sl_buy  = ND(buy-SLP*Point-spread*Point);
            
          if (iClose(NULL,1440,1) < iMA(NULL,1440,PeriodMA,0,MODE_EMA,PRICE_CLOSE,1)) 
                  OrderSendReliable(Symbol(), OP_SELLSTOP, Lots, (sell-spread*Point), Slippage, sl_sell,  tp_sell, comment, Magic, 0, Red);
                                                                         
                                                                        else
                  OrderSendReliable(Symbol(), OP_BUYSTOP,  Lots, (buy+spread*Point),  Slippage, sl_buy, tp_buy,  comment, Magic, 0, Blue);
                                                                       
         
            
         }else
         {
            tp_sell = ND(sell - MathAbs(buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +  MathAbs(buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs(buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs(buy-sell)*StopLossK);
         
            OrderSendReliable(Symbol(), OP_SELLLIMIT, Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0, Red);
            OrderSendReliable(Symbol(), OP_BUYLIMIT,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0, Blue);
         }
      }
   }
   return(0);
}
 
craft11111:

Hallo. Ich habe versucht, einen EA aus mehreren zu erstellen. Im Strategietester funktioniert alles einwandfrei (ich habe es im Visualisierungsmodus überprüft). Ich habe versucht, ein Demokonto zu benutzen, und ab und zu habe ich das folgende Problem, eine Order wird eröffnet und dann gelöscht, und das geschieht während einer Stunde, bis die Stunde wechselt. Ich dachte, es gibt eine Bedingung für die Eingabe und das Löschen der Bestellung zur gleichen Zeit, aber die Löschung ist nur in der Zeit, löschte ich diesen gesamten Block Fehler ist nicht verschwunden. Bitte teilen Sie uns mit, wo der Fehler liegt.

Es ist notwendig, einen Überlauf in einer Schleife durchOrderSelect zu machen

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

Soweit ich das verstanden habe, findet beim Auftreten einer Bedingung ein Übergang zur Änderungsfunktion statt, bei der nur der Auftrag select verwendet wird. Und ich habe auch versucht, dieses Stück alle den gleichen Fehler zu entfernen bleibt, und es ist nicht immer sichtbar, welche Bedingung auftritt.

void ModifyLoss()
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() < SL && (Ask - OrderOpenPrice())/Point>= BUP)
         {
            if (SL != ND(OrderStopLoss()))
               OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      } else
      if (OrderType() == OP_SELL)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() > SL && (OrderOpenPrice()-Bid)/Point >= BUP)
         {
            if (SL != ND(OrderStopLoss()))
                OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      }
   }
}
 
craft11111:

Hallo. Ich habe versucht, einen EA aus mehreren zu erstellen. Im Strategietester funktioniert alles einwandfrei (ich habe es im Visualisierungsmodus überprüft). Ich habe versucht, ein Demokonto zu benutzen, und ab und zu habe ich das folgende Problem, eine Order wird eröffnet und dann gelöscht, und das geschieht während einer Stunde, bis die Stunde wechselt. Ich dachte, es gibt eine Bedingung für die Eingabe und das Löschen der Bestellung zur gleichen Zeit, aber die Löschung ist nur in der Zeit, löschte ich diesen gesamten Block Fehler ist nicht verschwunden. Wenn jemand nicht schwer zu beraten ist, wo der Fehler liegt.

Sie müssen in der Funktion Print(__FUNCTION__) oder in Print(such-and-such block, such-and-such parameters) schreiben. Beachten Sie die Reihenfolge, in der die Funktionen/Blöcke ausgelöst werden. Der erste, der ausgelöst wurde und nicht hätte ausgelöst werden sollen, das ist dann die Frage. Sich darauf zu verlassen, dass "ich hier ziemlich unvereinbare Bedingungen für ihre gleichzeitige Auslösung beschrieben habe", ist keine gute Idee. Vielleicht hätte das Gerät nicht auslösen dürfen, aber externe Parameter haben das Auslösen ermöglicht, vielleicht hätte etwas im Gerät nicht auslösen dürfen.

 

OnChartEvent() funktioniert in der Testversion nicht.

Bitte zeigen Sie die Schaltfläche, die im Tester funktionieren kann. Klicken Sie z. B. auf , um die Flagge trade = true zu setzen; klicken Sie erneut auf ? trade = false;

 
Ghabo:

OnChartEvent() funktioniert in der Testversion nicht.

Bitte zeigen Sie die Schaltfläche, die im Tester funktionieren kann. Klicken Sie zum Beispiel auf das Flag trade = true; klicken Sie erneut? trade = false;

In OnTick() wird der Tastendruck gesteuert. Wenn es im Tester funktioniert - Steuerung in OnTick(), aber in der realen Welt wird diese Steuerung nicht ausgeführt und wird in OnChartEvent() gesteuert werden

Grund der Beschwerde: