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

 
novichok2018:

Il messaggio appare ancora al 12° minuto.

Inserire Print, all'inizio della funzione in cui si riempie l'array

Print("Range = ", ArrayRange(NewsArr,1));

e mostrare il numero di valori nella seconda dimensione

 
Ilya Prozumentov:

Posso dire da tutto ciò che NomNews entra nel ciclo While già in uno stato maggiore di 999. Allora dovete scoprire perché succede e resettare questa variabile da qualche parte.

Per verificarlo, scrivetelo all'inizio del ciclo:

Sì, all'11° minuto la stampa è 1000.

 
Alekseu Fedotov:

Inserire Print, all'inizio della funzione in cui si riempie l'array

e mostrare il numero di valori nella seconda dimensione

L'ho inserito all'iniziodel ciclo While e ho ottenuto l'infinitoRange = 1000. L'ho inserito nel posto sbagliato?

Cos'è questo numero (o funzione?): datetime TimeNewsFunck(int nomf)

{

stringa s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

return((datetime)(StringToTime(time) + GMTplus*3600))

}

E dove prende il valore di int nomf? Non sono riuscito a trovarlo.

 
novichok2018:

L'ho inserito all'iniziodel ciclo While e ho ottenuto infiniteRange = 1000. L'ho messo nel posto sbagliato?

E cos'è questo numero (o funzione?): datetime TimeNewsFunck(int nomf)

{

stringa s=NewsArr[0][nomf];

string time=StringConcatenate(StringSubstr(s,0,4),".",StringSubstr(s,5,2),".",StringSubstr(s,8,2)," ",StringSubstr(s,11,2),":",StringSubstr(s,14,4));

return((datetime)(StringToTime(time) + GMTplus*3600))

}

E dove prende il valore di int nomf? Non l'ho trovato.

E poi c'è la funzione che ho provato ma non sono riuscito a scoprire. Può essere la fonte del problema?

bool CheckInvestingNews(int &pwr,datetime &mintime)
  {

   bool CheckNews=false; pwr=0; int maxPower=0;
   if(MidleNews || HighNews)
     {
      if(TimeCurrent()-LastUpd>=Upd){Print("Investing.com News Loading...");UpdateNews();LastUpd=TimeCurrent();Comment("");}
      WindowRedraw();
      //---Draw a line on the chart news--------------------------------------------
      if(DrawNewsLines)
        {
         for(int i=0;i<NomNews;i++)
           {
            string Name=StringSubstr("NS_"+TimeToStr(TimeNewsFunck(i),TIME_MINUTES)+"_"+NewsArr[1][i]+"_"+NewsArr[3][i],0,63);
            if(NewsArr[3][i]!="")if(ObjectFind(Name)==0)continue;
            if(OnlySymbolNews && StringFind(ValStr,NewsArr[1][i])<0)continue;
            if(TimeNewsFunck(i)<TimeCurrent() && Next)continue;

            color clrf=clrNONE;
            if(HighNews && StringFind(NewsArr[2][i],"High")>=0)clrf=HighColor;
            if(MidleNews && StringFind(NewsArr[2][i],"Moderate")>=0)clrf=MidleColor;
   //         if(LowNews && StringFind(NewsArr[2][i],"Low")>=0)clrf=LowColor;

            if(clrf==clrNONE)continue;

            if(NewsArr[3][i]!="")
              {
               ObjectCreate(0,Name,OBJ_VLINE,0,TimeNewsFunck(i),0);
               ObjectSet(Name,OBJPROP_COLOR,clrf);
               ObjectSet(Name,OBJPROP_STYLE,LineStyle);
               ObjectSetInteger(0,Name,OBJPROP_WIDTH,LineWidth);
               ObjectSetInteger(0,Name,OBJPROP_BACK,true);
              }
           }
        }
      //---------------event Processing------------------------------------
      int ii;
      for(ii=0;ii<NomNews;ii++)
        {
         int power=0;
         if(HighNews && StringFind(NewsArr[2][ii],"High")>=0){ power=3; MinBefore=HighIndentBefore; MinAfter=HighIndentAfter; }
         if(MidleNews && StringFind(NewsArr[2][ii],"Moderate")>=0){ power=2; MinBefore=MidleIndentBefore; MinAfter=MidleIndentAfter; }
 //        if(LowNews && StringFind(NewsArr[2][ii],"Low")>=0){ power=1; MinBefore=LowIndentBefore; MinAfter=LowIndentAfter; }
         if(NFPNews && StringFind(NewsArr[3][ii],"Nonfarm Payrolls")>=0){ power=4; MinBefore=NFPIndentBefore; MinAfter=NFPIndentAfter; }
         if(power==0)continue;

         if(TimeCurrent()+MinBefore*60>TimeNewsFunck(ii) && TimeCurrent()-MinAfter*60<TimeNewsFunck(ii) && (!OnlySymbolNews || (OnlySymbolNews && StringFind(ValStr,NewsArr[1][ii])>=0)))
           {
            if(power>maxPower){   maxPower=power; mintime=TimeNewsFunck(ii); }
              }else{
            CheckNews=false;
           }
        }
      if(maxPower>0){ CheckNews=true; oppoz=true; }
     }
   pwr=maxPower; 
   return(CheckNews);
  }
 
novichok2018:

E poi c'è una funzione che non sono riuscito a capire, per quanto mi sia sforzato. Forse è lì il problema?

Solo l'autore lo capirà da solo. È meglio inviare il codice da OnTick()

 
novichok2018:

Sì, all'11° minuto ha dato la stampa 1000.

Prova a sostituire

while(!IsStopped())

con questa linea.

while(NomNews<300 && !IsStopped())
 
Ilya Prozumentov:

Eccesso((2*psd*usd)*((2*psd*usd)-C))/(C-1)) nella formula.

Per esponenziare: ^0.5 non è *0.5

Se non c'è un solo commercio sul simbolo guardato attraverso e majik, o non c'è un solo profitto o perdita, o c'è solo una coppia (C=1), otterremo la divisione per 0.

Prima della formula stessa, dovreste controllare che psd e usd siano > 0, e C !=1

Le coppie redditizie sono calcolate con profitto > 1, perdita < 1, con profitto=1 non sono analizzate, cioè anche 1 deve essere incluso da qualche parte in questo o quel gruppo.

Nella tua funzione, sarebbe meglio selezionare prima i numeri di transazione che corrispondono al simbolo e al numero magico e poi controllare se il loro numero è cambiato, se sì - ricalcolare zn, se no - restituire zn (zn in questo caso non si azzera e il controllo != 0 non sarà necessario quando si stampa)

Owl smette di funzionare, perché si basa sulle variabili ww e nn, e quando la tua funzione funziona, queste cambiano e rompono l'algoritmo dell'owl.

Niente sarebbe stato compilato se ci fosse stato un errore di progettazione del codice.

Posso solo dire grazie. Questo è l'unico posto a Runet dove mi hanno aiutato.

Ora la stampante genera il seguente "Stop_Ma_v_5.1 EURUSD,M15: == Z-count equals = -nan(ind)" . Potresti per favore consigliare cosa significa e il codice dovrebbe restituire il numero?

Codice :

//+------------------------------------------------------------------+
//| Подсчёт z-вероятности. @axe44 Алексей Корольков                  |
//+------------------------------------------------------------------+
  
double Z()
  {
    zn=0;          // z-число
    psd=0;         // кол. положительных сделок
    usd=0;         // количество отрицательных сделок 
    www=0;         // боол переменная 
    nnn=0;         // боол переменная
    kolichestvo=0; // подсчёт закрытых ордеров открытых роботом
    C=0;          // C = количество чередований между отрицательными и положительными сделками
    index=OrdersHistoryTotal(); 
      if(OrdersHistoryTotal()>302) index=301; // берём не более 301 сделки
    //if(index<30) return(0);                 // берём не менее 30
    count=OrdersHistoryTotal();             // считаем от скольки 
    prom=count-index;                       // выделяем только последние сделки
    if (prom<0) prom=0;                     // исключаем ошибки
  
   for( i=prom;i<=count;i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {// далее магия
           pribul=OrderProfit(); 
           if (ww==0&&pribul>1){C++;www=1;nnn=0;}// подсчитываем смену тенденции
           if (nn==0&&pribul<1){C++;www=0;nnn=1;}// подсчитываем смену тенденции 
           if (pribul>1){psd++;}//прибыльные сделки
           if (pribul<1){usd++;}// убыточные сделки
           kolichestvo++;
           }
        }
     }
    /*
Величина Z = (A * (C — 0.5) — B)/   ((B*(B — C))/(C -1))^(1/2), где:
A = количество анализируемых сделок;
B = 2*количество прибыльных сделок * количество убыточных сделок;
C = количество чередований в выборке (чередованием считается каждая пара сделок, 
когда прибыльная сделка сменяет убыточную либо наоборот).
          */ 
            
            if(kolichestvo>30&&psd>0&&usd>0&&C!=1)
            zn=(index*(C-0.5)-2*psd*usd)  /  pow(((2*psd*usd*(2*psd*usd-C))/(C-1)),0.5);
      
     
     
   return(zn);
  }
Grazie
 
aleksandr bebishev:

Ragazzi di Mql5, potete aiutarmi a fare una richiesta per chiudere una posizione in un conto hedge? Situazione: posizione BUY aperta, abbiamo bisogno di chiuderla con Sell Limit. Domanda: Come faccio a scrivere correttamente una richiesta, per chiudere esattamente la posizione scelta, e non per aprire un nuovo SELL bloccando BUY? Per favore, scrivi un pezzo di codice con dei commenti! Grazie in anticipo!

Chiusura da parte di un ordine aperto di un altro ordine aperto per lo stesso simbolo ma in direzione opposta.

boolOrderCloseBy(
intticket,// numero di ordine da chiudere
intopposite,// numero dell'ordine opposto
colorearrow_color// colore
);

Parametri

biglietto

[Numero d'ordine unico dell'ordine da chiudere.

di fronte a

[Un numero di sequenza unico dell'ordine opposto.

colore_freccia

[Il colore della freccia di chiusura sul grafico. Se questo parametro manca o il suo valore è CLR_NONE, la freccia non viene mostrata nel grafico.

Valore restituito

Restituisce true se la funzione è riuscita o false se c'è stato un errore. Per ottenere le informazioni sull'errore, chiamare GetLastError().

Esempio:

se(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
ritorno(0);
}

P.S. Questo thread analizza solo MQL4

 
Aliaksei Karalkou:

Posso solo dire grazie. Questo è l'unico posto in runet, dove hanno aiutato.

Ora la stampante genera il seguente "Stop_Ma_v_5.1 EURUSD,M15: == Z-Account Equals = -nan(ind)". Potresti per favore consigliare cosa significa e il codice dovrebbe restituire il numero?

Codice :

Grazie
Nan - NaN - Not a Number - Non un numero. Prova a normalizzare i numeri nel calcolo Z
 
Aliaksei Karalkou:

La chiusura di un ordine aperto da un altro ordine aperto per lo stesso strumento, ma nella direzione opposta.

boolOrderCloseBy(
intticket,// numero di ordine da chiudere
intopposite,// numero dell'ordine opposto
colorearrow_color// colore
);

Parametri

biglietto

[Un numero sequenziale unico dell'ordine da chiudere.

di fronte a

[Un numero di sequenza unico dell'ordine opposto.

colore_freccia

[Il colore della freccia di chiusura sul grafico. Se il parametro manca o il suo valore è CLR_NONE, la freccia non viene mostrata nel grafico.

Valore restituito

Restituisce true se la funzione è riuscita o false se c'è stato un errore. Per ottenere le informazioni sull'errore, chiamare GetLastError().

Esempio:

se(iRSI(NULL,0,14,PRICE_CLOSE,0)>75)
{
OrderCloseBy(order_id,opposite_id;)
ritorno(0);
}

P.S. Questo thread analizza solo MQL4

No. Qualsiasi domanda su mql4 così come su mal5 è gestita qui in questo thread, perché lo scopo principale era quello di aiutare non solo con algoritmi e codici ma anche di facilitare la migrazione da mql4 a mql5.

Motivazione: