Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 935

 

Questo inconveniente sembra verificarsi se ci sono altri ordini nel mercato ma di dimensioni diverse.

Supponiamo di avere 4 vendite di 1 lotto e 4 acquisti di 1 lotto. E 1 compra 0,5 lotti.

Come evitare questo? Credo che questa funzione abbia bisogno di un ciclo.

 
EgorKim:

Questo inconveniente sembra verificarsi se ci sono altri ordini nel mercato ma di dimensioni diverse.

Supponiamo di avere 4 vendite di 1 lotto e 4 acquisti di 1 lotto. E 1 compra 0,5 lotti.

Come evitare questo? Forse, ci dovrebbe essere un ciclo in questa funzione.

Non so dove sia la "drubashka". È la sua specialità lavorare attraverso la libreria standard. Non so cosa stia raccogliendo.

      if(m_position.SelectByIndex(i))

E sarebbe troppo pigro per risolverlo.

Avrei affrontato la soluzione in modo un po' diverso. Creerei due array con i ticket di posizione Buy e Sell separatamente e chiuderei le posizioni nel secondo ciclo a coppie.

Oppure possiamo creare un array bidimensionale. Ma bisogna essere molto attenti nella distribuzione degli indici. In modo che non ci siano lacune...

 
Alexey Viktorov:

Da qualche parte il batterista è scomparso. È il suo modo di lavorare attraverso la libreria standard. Non so cosa stia scegliendo.

Sì, e sono troppo pigro per risolverlo.

Avrei affrontato la soluzione in modo un po' diverso. Creerei due array con i ticket di posizione Buy e Sell separatamente e li chiuderei nel secondo ciclo a coppie.

Oppure possiamo usare un array bidimensionale. Ma devo essere molto attento nella distribuzione degli indici. In modo che non ci siano lacune...

Ci ho pensato anch'io. Puoi condividere il codice con due array? Non posso farlo da solo.

Come soluzione temporanea, ho creato un ciclo limitato. Non so se questo codice sia corretto o meno, ma potrebbe essere qualcosa. È vero, si chiude stranamente con la divisione dei lotti.

A quanto pare anche i volumi del contatore dovrebbero essere confrontati per evitare la scissione. Mi arrendo.

void CloseBy()
  {
   int s=10;
   do // цикл
     {
      s--;
      ulong ticket_buy=ULONG_MAX;
      ulong ticket_sell=ULONG_MAX;
      for(int i=0;i<PositionsTotal();i++) // ATTENTION! Here, specially began a detour with "0"
         if(m_position.SelectByIndex(i)) // selects the position by index for further access to its properties
           {
            if(m_position.PositionType()==POSITION_TYPE_BUY && ticket_buy==ULONG_MAX)
               ticket_buy=m_position.Ticket();

            if(m_position.PositionType()==POSITION_TYPE_SELL && ticket_sell==ULONG_MAX)
               ticket_sell=m_position.Ticket();
           }
      if(ticket_buy!=ULONG_MAX && ticket_sell!=ULONG_MAX)
         m_trade.PositionCloseBy(ticket_buy,ticket_sell);
     }
   while(s>1);// цикл
   return;
  }
 
EgorKim:

Io stesso ci ho pensato. Puoi condividere il codice con due array?

No, per diverse ragioni.

1. Io stesso non uso la chiusura del contatore.

2. Non c'è un codice già pronto e non c'è il desiderio di scriverlo appositamente.

3. Ieri ho avuto un'idea simile. Ieri ho avuto un'idea simile. Oggi ne ho un altro e domani, Dio non voglia, ne avrò un altro. Di conseguenza, scrivo solo quello che ho in mente al momento.

E la ragione principale - penso che aiutare e fare il lavoro di qualcun altro, sono due grandi differenze.

Posso solo aiutare. Ma non posso aiutarti, quasi non uso la libreria standard e per capire il tuo codice, ho bisogno di capire SB.

 

Ciao a tutti

Potete darmi un esempio di un indicatore o di una funzione che permetta di creare un indicatore che mostri il risultato sul grafico solo in un certo intervallo o area del grafico!

Per esempio dall'1:00 alle 2:35 ora terminale, E questa scelta deve essere fatta con il mouse direttamente sul grafico.


In particolare ho bisogno di contare il numero di candele a barre o di vendita nell'intervallo selezionato.

 
Milhail Novgorodcev:

Ciao a tutti

Potete darmi un esempio di un indicatore o di una funzione che permetta di creare un indicatore che mostri il risultato sul grafico solo in un certo intervallo o area del grafico!

Per esempio dall'1:00 alle 2:35 ora terminale, E questa scelta deve essere fatta con il mouse direttamente sul grafico.


In particolare ho bisogno di contare il numero di candele Buy o Sell nell'intervallo selezionato.

La prima cosa che mi è venuta in mente:

  • uno script, due parametri di input - tempo da- e tempo a-
  • un rettangolo è disegnato manualmente e lo script deve essere lanciato con il nome del rettangolo nei parametri di input
  • Expert Advisor o indicatore che traccia la creazione di un rettangolo con un determinato nome ...

 
Milhail Novgorodcev:

Ciao a tutti

Potete darmi un esempio di un indicatore o di una funzione che permetta di creare un indicatore che mostri il risultato sul grafico solo in un certo intervallo o area del grafico!

Per esempio dall'1:00 alle 2:35 ora terminale, E questa scelta deve essere fatta con il mouse direttamente sul grafico.


In particolare ho bisogno di contare il numero di candele Buy o Sell nell'intervallo selezionato.

Qual è il problema?

In OnChartEvent () a due variabili, aturno, viene assegnato il tempo del clic del mouse in due punti (non il tempo corrente, ma il tempo della barra, su cui si è fatto clic) e, a condizione che entrambe le variabili non siano zero, questo intervallo viene calcolato. Dopo l'uscita di queste variabili, vengono azzerate e aspettano il prossimo clic del mouse.

L'unico problema che vedo è se il primo clic viene fatto per errore, come annullarlo. Ma penso che sia possibile trovare qualcosa con attenzione dopo aver letto la documentazione. Per esempio, premendo un tasto o scorrendo la rotella del mouse...

 

Per favore, aiutatemi!

Stanco di aggiustare lo script per fare screenshot sulla storia. Lo script dovrebbe scorrere fino alle 8 di ogni giorno e fare uno screenshot.

Lo script non funziona come dovrebbe.

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ChartSetInteger(0,CHART_SHIFT,false);
   ChartSetInteger(0,CHART_AUTOSCROLL,false);
   int _bars=Bars(Symbol(),0);
 
   for(int i=0; i<_bars; i++)
     {
      MqlDateTime time_now;
      //datetime candle_time=iTime(NULL,_period,0);
      TimeToStruct(iTime(NULL,_Period,i),time_now);  // change time to struct

      if(time_now.hour==8 && time_now.min==0)
        {
         //--- прокрутим на 10 баров вправо от начала истории 
         ChartNavigate(0,CHART_BEGIN,i);
         Sleep(5000);
         //--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
         long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
         Print(first_bar);
         string name=_Sumbol_N(string(Symbol()))+"_"+Symbol()+"_"+TFMigrate(Period())+" "+string(time_now.year)+"."+string(time_now.mon)+"."+string(time_now.day)+" "+string(time_now.hour)+"."+string(time_now.min);

         ChartScreenShot(0,name+" 2560_1600.PNG",2560,1600,ALIGN_LEFT);
         //i=5;
        };
     };

//Print(iTime(NULL,_Period,0));

  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string _Sumbol_N(string ft)
  {
   if(ft ==  "EURUSD" ) return("01");
   if(ft ==  "GBPUSD" ) return("02");

   return "";
  }
//+------------------------------------------------------------------+
string TFMigrate(int tf)
  {
   switch(tf)
     {
      case 0: return("CURRENT");
      case 1: return("M1");
      case 5: return("M5");
      case 15: return("M15");
      case 30: return("M30");
      case 60: return("H1");
      case 240: return("H4");
      case 1440: return("D1");
      case 10080: return("W1");
      case 43200: return("MN1");

     }
  }
//+------------------------------------------------------------------+
 
oleg360:

Per favore, aiutatemi!

Stanco di aggiustare lo script per fare screenshot sulla storia. Lo script dovrebbe scorrere fino alle 8 di ogni giorno e fare uno screenshot.

Lo script non funziona come dovrebbe.

Finora, la funzione di scorrimento funziona in modo irregolare (o piuttosto funziona in modo imprevedibile). L'amministratore sta risolvendo il problema.

 
Vladimir Karputov:

Finora, la funzione di scorrimento non funziona bene (o piuttosto funziona in modo imprevedibile). L'amministratore sta risolvendo il problema.

Grazie!