Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 484

 
Amici, ho più di una domanda sulle impostazioni del segnale.
Il problema è il seguente: quando gli ordini del Fornitore sono chiusi, gli ordini dell'Abbonato sono ancora trattenuti. Apparentemente a causa della differenza di diffusione. Come posso fare in modo che le offerte di un abbonato siano chiuse immediatamente quando sono chiuse in quello del fornitore? Quale impostazione dovrebbe essere cambiata?
 
Leo59:
Grazie Alexey!!!! per 4))))

Così... ho trovato il mio vecchio tacchino e ho tagliato quello che mi serviva da esso. Non lo scriverò per voi)), ma servirà come inizio. Ho aggiunto dei commenti lì, i nomi delle variabili sono chiari dai nomi.

datetime date[]; // тут будем хранить данные времени баров, которые видны на экране
// если нужны другие данные баров, заводим соотв. массивы 

void DoWork(bool redrawAll = false)
{
    int visibleBars = 1, firstVisibleBars = 0;
    visibleBars = (int)ChartGetInteger(0, CHART_VISIBLE_BARS);
    firstVisibleBars = (int)ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR);
    
    ArrayResize(date, visibleBars + 10); // выделяем память с запасом

    // так можно узнать масштаб графика, может пригодится
    int scale = (int)ChartGetInteger(0, CHART_SCALE);
    // копируем данные времен баров 
    if (CopyTime(Symbol(), Period(), startpos, visibleBars, date) == -1)
    {
        Print("Не удалось скопировать значения времени! Код ошибки = ", GetLastError());
        return;
    }

    //--- определим шаг, если надо работать с масштабом
    int step = 1;
    switch (scale)
    {
    case 0:
        step = 12;
        break;
    case 1:
        step = 6;
        break;
    case 2:
        step = 4;
        break;
    case 3:
        step = 2;
        break;
    }
    double priceMin = ChartGetDouble(0,CHART_PRICE_MIN,0);
    double priceMax = ChartGetDouble(0,CHART_PRICE_MAX,0);

    for (int i = visibleBars - 1; i >= 0; i--)
    {
        /*
        проходимся по всем видимым барам и ищем стрелки, искать можно путями:
        1. Изначально при создании стрелок надо формировать имена стрелок с привязкой ко времени, например
        string name = "UpArrow"  + IntegerToString(TimeCurrent());
        тогда тупо ищем стрелку с таким именем и далее двигаем, куда надо
        2. Заносить стрелки в структуры и класть их в хештаблицу, первый проще
        */
    }
    
}
 
Artem Prischepa:
Amici miei, ho una domanda più che altro sull'impostazione del segnale.
Il problema è il seguente: quando gli ordini di un fornitore sono chiusi, rimangono ancora su quello dell'abbonato. Apparentemente a causa della differenza di diffusione. Come posso fare in modo che le offerte di un abbonato siano chiuse immediatamente quando sono chiuse in quello del fornitore? Quale impostazione dovrebbe essere cambiata?

L'affare dovrebbe anche chiudersi quasi istantaneamente. Domande:

  1. Il terminale dell'abbonato è acceso in questo momento?
  2. Si prega di allegare il file di log del terminale per il giorno del problema.
 
Alexey Volchanskiy:

Così... ho trovato il mio vecchio tacchino e ho tagliato quello che mi serviva da esso. Non lo scriverò per voi)), ma servirà come inizio. Ho aggiunto dei commenti lì, i nomi delle variabili sono chiari dai nomi.

Inoltre, probabilmente dovrei mettere il numero di sottofinestra dell'indicatore in questa linea? Solo che non so esattamente cosa sia necessario

ChartGetDouble(0,CHART_PRICE_MIN,0);
 
Alexey Volchanskiy:

Addendum, probabilmente dovreste mettere il numero di sottofinestra dell'indicatore su questa linea? Solo che non so esattamente cosa sia necessario

Oooops, distratto questa mattina, non ho copiato la gestione degli eventi del grafico nel codice

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
    if(id == CHARTEVENT_CHART_CHANGE)
    {
        DoWork(true);
        ChartRedraw();
    }    
}
 
Alexey Volchanskiy:

Così... ho trovato il mio vecchio tacchino e ho tagliato quello che mi serviva da esso. Non lo scriverò per voi)), ma servirà come inizio. Ho aggiunto dei commenti lì, i nomi delle variabili sono chiari dai nomi.

Grazie Alexey per il tuo aiuto!

E dove attaccare il passo, e in generale la sua funzionalità, su cosa?

    //--- определим шаг, если надо работать с масштабом
    int step = 1;

E questo:

        2. Заносить стрелки в структуры и класть их в хештаблицу, первый проще

Non l'ho mai fatto. Se puoi, per favore dammi un esempio di codice, in modo che io possa capire, comprendere e applicare.

 
Alexey Volchanskiy:

Oooops, distratto stamattina, non ho copiato la gestione degli eventi del grafico nel codice

Vorrei avere la tua distrazione insieme alla tua conoscenza))
È abbastanza facile quando si sa. Basta battere sui tasti, basta avere il desiderio e i mezzi per farlo.
E quando non lo sai e stai scavando... è una rottura di palle... E se ci sono altri accenni, sei fregato, senza nervi.
Quindi grazie per i consigli!!!!
 
Leo59:
Grazie Alexey per il tuo aiuto!

Dove si avvita il lancio, e la sua funzionalità in generale, su cosa?

E questo:

Non l'ho mai fatto. Se potete, vi prego di darmi un esempio di codice, in modo che io possa capirlo, comprenderlo e usarlo.

Quando comprimiamo il grafico orizzontalmente (tasti +/-), cambia la scala e a volte gli oggetti grafici possono sovrapporsi tra loro. Ho citato questo codice solo nel caso in cui, come determinare la scala.

Non citerò il codice con l'hash - non ce l'ho, mi è solo venuto in mente. È meglio fare la variante 1, è più semplice.

Per quanto riguarda la conoscenza - consiglio a tutti coloro che studiano, leggete l'aiuto a vostro piacimento, saltate intorno alle sezioni, dove si trova tutto. Vale a dire, non stipare, io ero un tale stipatore, a nulla di buono. Basta sapere, almeno approssimativamente, che ci sono tali e quali... almeno sezioni/sottosezioni. Poi, quando sorgeranno delle domande, gli ingranaggi gireranno nella vostra testa e nascerà una direzione di ricerca. In linea di principio, l'aiuto non è perfetto, ma va bene, ci sono molti esempi.

Poiché il linguaggio è semplice, non è difficile da imparare. Le difficoltà sorgono con API, dove cercare cosa e come applicare

 
Ciao!

A prima vista, il compito sembra semplice come tre centesimi. MA! ....
C'è una linea di qualsiasi oscillatore nella finestra dell'indicatore, che oscilla rispetto a "0" con diversa ampiezza.
Il problema reale è:
- All'incrocio "0" dal basso verso l'alto, disegnate una freccia sul bordo inferiore della finestra dell'indicatore,
- A "0" attraversando dall'alto verso il basso, per disegnare una freccia vicino al bordo superiore della finestra dell'indicatore,
- all'autoscala del grafico dell'oscillatore nella finestra dell'indicatore, le frecce dovrebbero rimanere automaticamente ai loro bordi della finestra dell'indicatore.
Cioè, scorrendo il grafico avanti e indietro nella storia, o cambiando la sua scala orizzontale, le frecce dovrebbero sempre rimanere automaticamente ai confini della finestra dell'indicatore.

Per favore non date consigli, "aiutatemi finanziariamente")). Si prega di allegare il codice sorgente di una tale funzione, o un link ad esso.

Grazie in anticipo!
 

Per favore, aiutatemi a capire!

Ho bisogno di trovare il drawdown massimo su ogni (sia) giorno (la scrittura sul file avviene una volta al giorno) - terminale MT4.

Il max drawdown è la distanza sul grafico dal picco all'attuale drawdown dei fondi e il drawdown dei fondi è la perdita attuale.

Ho scritto il seguente codice

   if(Analiz_Prosadki==true)
     {
      if(ContolSavaTXT==1)
        {
         ProfitNew=0;
         ProfitMin=0;
         ContolSavaTXT=0;
        }

      if(ContolSavaTXT==0)
        {
         ProfitNew=AccountInfoDouble(ACCOUNT_PROFIT);
         BalansNew==AccountInfoDouble(ACCOUNT_BALANCE);  //Текузее значение баланса
         if (BalansNew>BalansMax) BalansMax=BalansNew;
         if (ProfitNew<ProfitMin && BalansNew>=BalansMax) ProfitMin=ProfitNew;
         if (ProfitNew<ProfitMin && BalansNew<BalansMax) ProfitMin=ProfitNew-(BalansMax-BalansNew);
        }

      ContolSavaTXT=Printer.Write((string)TimeCurrent(),ProfitMin);   // Пишем информацию в файл - функция возвращает 1
     }

Ma è corretto in alcuni grafici e scorretto in altri. Allo stesso tempo, i grafici sono visivamente uguali.

Devo aver fatto un errore nel codice o nella logica, ma non riesco a capire di che tipo.