Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 762

 
Artyom Trishkin:

Capisco che bisogna in qualche modo indicare all'Expert Advisor il ticket della posizione aperta manualmente, che si vuole che tracci.

  1. Dovresti aggiungere all'Expert Advisor il monitoraggio delle posizioni appena aperte e se non ha un magik, significa che è stato aperto manualmente. L'Expert Advisor segna l'apertura di questa posizione sul prezzo e sulla barra della sua apertura. Il nome dell'oggetto deve contenere un prefisso con il nome comune dell'oggetto per tutti questi oggetti, per esempio "manual_" e deve essere presente anche il biglietto della posizione. Di conseguenza, il nome dell'oggetto può essere il seguente: "manuale_12345678". Qui: manual_ - prefisso, 12345678 - posizione biglietto.
  2. Aggiungere all'Expert Advisor OnChartEvent() e monitorare l'evento del clic del mouse sull'oggetto. Analizza il nome dell'oggetto e se contiene una sottostringa manual_, allora cerca un numero dopo manual_. Questo numero è il biglietto della posizione su cui avete cliccato.
  3. Poi è necessario salvare il numero trovato in modo che non venga perso quando si riavvia l'EA/terminale/computer/mondo... Per esempio, nelle risorse o nelle variabili globali del terminale.
  4. L'Expert Advisor dovrebbe leggere questa risorsa e prendere il biglietto della posizione da pescare da essa
  5. Nel ciclo di trawl, dovresti recuperare il biglietto della posizione selezionata e cercare questo numero nella lista dei biglietti salvati. Se viene trovato un biglietto di questo tipo, la posizione con questo biglietto deve essere tracciata.
  6. Se il numero di posizioni viene cambiato, il biglietto della posizione chiusa deve essere controllato e trovato nella lista salvata. Se un tale biglietto esiste nella lista, deve essere cancellato da quella lista - la posizione non esiste più, e non c'è niente da fare con il suo biglietto nella lista dei biglietti per il trawling.
Qualcosa del genere. La logica è stata scritta su una manovella, quindi non poteva prendere in considerazione qualcosa...


Grazie per il chiarimento, ora capisco cosa intendo.

Per me lezioni mql consiglia di impostare 3 (EURUSD), ma la liquidità delle valute è diversa e così è la loro velocità. Quali sono le cifre che possono essere utilizzate come linea guida durante le normali condizioni di mercato per le coppie e i cross di dollari?

 
È possibile riempire un buffer multidimensionale con CopyOpen, CopyHigh, CopyLow e CopyClose? La descrizione dice che copia in un array dinamico - ma un array dinamico può essere multidimensionale MQL5
 
Alexandr Sokolov:
È possibile riempire un buffer multidimensionale usando le funzioni CopyOpen, CopyHigh, CopyLow e CopyClose? La descrizione dice che copia in un array dinamico - ma un array dinamico può essere multidimensionale MQL5

Usa un array monodimensionale...

 
Alexandr Sokolov:
È possibile riempire un buffer multidimensionale usando le funzioni CopyOpen, CopyHigh, CopyLow e CopyClose? La descrizione dice che copia in un array dinamico - ma un array dinamico può essere multidimensionale.

Se avete difficoltà a capire le strutture, potete usare ArrayCopyRates

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

Se avete una buona comprensione di esso, è meglio

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

Salve. Ho provato a costruire un EA da diversi, tutto funziona correttamente nello strategy tester (ho controllato in modalità visualizzazione). Ho provato ad usare un conto demo e ogni tanto ho il seguente problema, un ordine viene aperto e poi cancellato, e questo accade durante un'ora, fino a quando l'ora cambia. Ho pensato che c'è una condizione per inserire e cancellare l'ordine allo stesso tempo, ma la cancellazione è solo nel tempo, ho cancellato questo intero blocco errore non è scomparso. Se qualcuno non è difficile dirmi dove l'errore.

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:

Salve. Ho provato a costruire un EA a partire da diversi, tutto funziona correttamente nello strategy tester (l'ho controllato in modalità visualizzazione). Ho provato a usare un conto demo e ogni tanto ho il seguente problema, un ordine viene aperto e poi cancellato, e questo succede durante un'ora, fino a quando l'ora cambia. Ho pensato che c'è una condizione per inserire e cancellare l'ordine allo stesso tempo, ma la cancellazione è solo nel tempo, ho cancellato questo intero blocco errore non è scomparso. Si prega di avvisare dove si trova l'errore.

È necessario fare l'overflow in un ciclo attraversoOrderSelect

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
 

Per quanto ho capito, quando si verifica una condizione, avviene un passaggio alla funzione di modifica dove si usa solo l'ordine select. E ho anche provato a rimuovere questo pezzo tutto lo stesso errore rimane, e non è sempre visibile quale condizione si verifica.

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:

Salve. Ho provato a costruire un EA da diversi, tutto funziona correttamente nello strategy tester (ho controllato in modalità visualizzazione). Ho provato ad usare un conto demo e ogni tanto ho il seguente problema, un ordine viene aperto e poi cancellato, e questo succede durante un'ora, fino a quando l'ora cambia. Ho pensato che c'è una condizione per inserire e cancellare l'ordine allo stesso tempo, ma la cancellazione è solo nel tempo, ho cancellato questo intero blocco errore non è scomparso. Si prega di avvisare dove si trova l'errore.

Dovete scrivere nella funzione Print(__FUNCTION__) o in Print(tale e tale blocco, tali e tali parametri). Osservate l'ordine in cui le funzioni/blocchi vengono attivati. Il primo che si è innescato e che non avrebbe dovuto, è lì che si trova la domanda allora. Basarsi sul fatto che "ho descritto qui condizioni piuttosto incompatibili per il loro innesco simultaneo" non è una buona idea. Forse l'unità non avrebbe dovuto attivarsi, ma i parametri esterni hanno permesso che si attivasse, forse qualcosa all'interno dell'unità non avrebbe dovuto attivarsi.

 

OnChartEvent() non funziona nel tester.

Si prega di mostrare il pulsante che può funzionare nel tester. Per esempio, fare clic su che solleverà la bandiera trade = true; fare clic di nuovo? trade = false;

 
Ghabo:

OnChartEvent() non funziona nel tester.

Si prega di mostrare il pulsante che può funzionare nel tester. Per esempio, fare clic su che solleverà la bandiera trade = true; fare clic di nuovo? trade = false;

In OnTick() controlla la pressione del pulsante. Potete fare per condizione, se funziona nel tester - controllo in OnTick(), ma nel mondo reale questo controllo non sarà eseguito e sarà controllato in OnChartEvent()

Motivazione: