Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate oltre. Da nessuna parte senza di te - 6. - pagina 2

 
gyfto:


Ho la seguente domanda. C'è un blocco in init(), che blocca il terminale (è quello che voglio trasferire a dll). Naturalmente, il registro non può essere visualizzato - il terminale viene chiuso solo da Ctrl+Alt+Canc. Stabilire la stampa per tracciare (e misurare il tempo di transito dei cicli che entrano nel blocco) non aiuta - la stampante non scrive nulla, il logging non viene nemmeno creato. Provo a usare FileOpen/FileWrite con lo stesso scopo - il file è appena creato (0 Kb), e silenzio. Ho messo FileWrite dopo FileOpen, sulla linea successiva - nessun effetto. Da che parte devo scavare?

Provate a usare questo. Se non aiuta, per cercare gli errori, puoi mettere temporaneamente il blocco di inizializzazione menzionato in start for one-time start via flag e provare a "tirare" i log da esso.
 
gyfto:


L'argomento è stato chiuso... Uomo cattivo.

Ho la seguente domanda. C'è un blocco in init(), che blocca il terminale (è quello che voglio trasferire a dll). Naturalmente, il registro non può essere visualizzato - il terminale viene chiuso solo da Ctrl+Alt+Canc. Stabilire la stampa per tracciare (e misurare il tempo di attesa dei cicli che entrano in blocco) non aiuta - la stampante non scrive nulla, il logging non viene nemmeno creato. Provo a usare FileOpen/FileWrite con lo stesso scopo - il file è appena creato (0 Kb), e silenzio. Ho messo FileWrite dopo FileOpen, sulla linea successiva - nessun effetto. Qual è la direzione per scavare?


Guarda, non c'è nessun nascosto negli attributi?


Non lo è.
 
TarasBY:
Prova a usare questo. Se questo non aiuta, per cercare gli errori, puoi prendere temporaneamente il blocco di inizializzazione menzionato nell'avvio per un avvio una tantum tramite un flag e provare a "tirare" i log da esso.


Né l'avvio una tantum in start né ininit funziona - né Print né FileWrite. Allego questo pezzo di codice (non vedo un'altra via d'uscita), non ho intenzione di postarlo qui, perché è troppo lungo. Ho rimosso tutte le dichiarazioni di buffer e descritto tutte le chiamate di indicatori tecnici incorporati lì. Ho già pensato all'overflow di memoria con gli array, ho calcolato che l'array più grande più tutti gli altri array sono cinquanta metri e mezzo. Beh, se non si stampa nemmeno sulla prima riga, quando si entra nel blocco... - è questo che mi preoccupa. La versione allegata è vera con FileWrite.
File:
eflfcaj.mq4  10 kb
 
gyfto:

Non funziona né il lancio una tantum all'avvio né ininit - né Print né FileWrite. Allego questo pezzo di codice (non vedo un'altra via d'uscita), non lo incollo qui perché è troppo lungo. Ho rimosso tutte le dichiarazioni di buffer e descritto tutte le chiamate di indicatori tecnici incorporati lì. Ho già pensato all'overflow di memoria con gli array, ho calcolato che l'array più grande più tutti gli altri array sono cinquanta metri e mezzo. Beh, se non si stampa nemmeno sulla prima riga, quando si entra nel blocco... - è questo che mi preoccupa. La versione allegata è vera con FileWrite.

Lo stile del codice non lo elimina. Niente spazi, parentesi a diversi livelli, diverse operazioni in fila, nessun commento... Incubo! :-))

Lei stesso ne sa qualcosa?

 
Aiuta a risolvere un problema con MT4. Quando si richiama un indicatore personalizzato, i suoi parametri di input e i colori della finestra non vengono visualizzati (lampeggia rapidamente e scompare). Come risolvere il problema? Reinstallato MT4, non ha aiutato.
 
gyfto:


Ha chiuso l'argomento... Non è un uomo buono.


= :)
 
gyfto:

Né l'avvio una tantum né l'avvio iniziale funzionano - né Print, né FileWrite. Allego questo pezzo di codice (non vedo un'altra via d'uscita), non lo incollo qui perché è troppo lungo. Ho rimosso tutte le dichiarazioni di buffer e descritto tutte le chiamate di indicatori tecnici incorporati lì. Ho già pensato all'overflow di memoria con gli array, ho calcolato che l'array più grande più tutti gli altri array sono cinquanta metri e mezzo. Beh, se non si stampa nemmeno sulla prima riga, quando si entra nel blocco... - è questo che mi preoccupa. La versione allegata è vera con FileWrite.

Sono d'accordo con Vadim - il codice è difficile da leggere. Provate a decomporre questo codice in blocchi funzionali, in ogni blocco stampate o scrivete su file. Ed eseguirlo in una struttura che "rallenta" l'esecuzione del codice, per esempio, così:

void SteppingThrough()
{
    int  li_Time = TimeLocal(), li_N = 0;
    bool lb_work = true, lb_break = false;
    while (IsStopped() == false)
    {
        if (lb_work)
        {
            switch (li_N)
            {
                case 0:
                    //---- Block 1
                    lb_work = false;
                    li_N++;
                    break;
                case 1:
                    //---- Block 2
                    lb_work = false;
                    li_N++;
                    break;
                case N:
                    //---- Block N
                    lb_break = true;
                    li_N++;
                    break;
            }
            if (lb_break) break;
        }
        if (TimeLocal() > li_Time) {li_Time = TimeLocal(); lb_work = true;}
    }
}

Ritarda l'esecuzione del prossimo blocco di 1 sec. - Il terminale dovrebbe avere abbastanza tempo per stampare il registro.

 
 

Ci sono 2 funzioni molto simili in Kim "la bandiera di chiusura dell'ultima posizione per STOP" e l'altra per TAKE.

ecco il codice

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по стопу.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByStop(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, osl;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    osl=NormalizeDouble(OrderStopLoss(), dg);
    if (ocp==osl) return(True);
  }
  return(False);
}
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия последней позиции по тейку.           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(OrderSymbol(), MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}

Come potete vedere sono molto simili.

Ma per qualche ragione, solo la chiusura tramite STOP funziona per me.

SL=  isCloseLastPosByStop("", -1, -1);
TP=  isCloseLastPosByTake("", -1, -1);

Print(SL,"_",TP); 

Funziona, ma il mio Expert Advisor non stampa UNIT, ma continua a stampare NULL.

Ma la chiusura a STOP stampa correttamente: se stop = 1, se non stop =0....

aiutatemi per favore....

 
lottamer:

Ci sono 2 funzioni molto simili in Kim "la bandiera di chiusura dell'ultima posizione per STOP" e l'altra per TAKE.

Ecco il codice

Come potete vedere sono molto simili.

Ma per qualche ragione, solo la chiusura tramite STOP funziona per me.

Apro la posizione manualmente, metto short TAKE. funziona - ma EA non stampa UNIT, ma continua a stampare NULL.

Ma la chiusura a STOP stampa correttamente: se stop = 1, se non stop =0....

aiutatemi a capire questo per favore....


Guarda attentamente a quale prezzo l'ordine stop aveva nella posizione aperta e a quale prezzo ha chiuso. La funzione di Igor confronta questi prezzi esatti ma non tiene conto dello slippage.