Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 738

 
novichok2018:

A mensagem ainda aparece no 12º minuto.

Inserir impressão, no início da função onde a matriz é preenchida

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

e mostrar o número de valores na segunda dimensão

 
Ilya Prozumentov:

Eu posso dizer de tudo que o NomNews entra no loop já em um estado maior que 999. Então você precisa descobrir por que isso acontece e reiniciar essa variável em algum lugar.

Para verificar isso, escreva-o no início do laço:

Sim, no 11º minuto a impressão é de 1000.

 
Alekseu Fedotov:

Inserir impressão, no início da função onde a matriz é preenchida

e mostrar o número de valores na segunda dimensão

Eu o inseri no iníciodo laço While e fiquei comalcance infinito= 1000. Eu o inseri no lugar errado?

Qual é este número (ou função?): data/hora TimeNewsFunck(int nomf)

{

string 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 de onde vem o valor do int nomf ? Não consegui encontrá-lo.

 
novichok2018:

Inseri-o no iníciode Whileloop e fiquei comalcance infinito= 1000. Coloquei-o no lugar errado?

Qual é este número (ou função?): data/hora TimeNewsFunck(int nomf)

{

string 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 de onde vem o valor do int nomf ? Eu não o encontrei.

E depois há a função que eu tentei, mas não consegui descobrir. Pode ser a fonte do 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 depois há uma função que ainda não consegui descobrir, por mais que eu tenha tentado. Talvez seja aí que reside o problema?

Somente o próprio autor descobrirá isso. É melhor você enviar o código da OnTick()

 
novichok2018:

Sim, no 11º minuto deu impressão de 1000.

Tente substituir

while(!IsStopped())

com esta linha.

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

Excesso((2*psd*usd)*((2*psd*usd)-C))/(C-1)) na fórmula.

Para exponenciar: ^0,5 não é *0,5

Se não houver um único comércio sobre o símbolo e majik, ou não houver um único lucro ou perda, ou houver apenas um par (C=1), obteremos a divisão por 0.

Antes da fórmula em si, você deve verificar se psd e usd são > 0, e C !=1

Os pares rentáveis são calculados com lucro > 1, perda < 1, com lucro=1 não são analisados, ou seja, 1 também tem que ser incluído em algum lugar neste ou naquele grupo.

Em sua função, seria melhor primeiro selecionar números de transação correspondentes ao símbolo e ao número mágico e depois verificar se o número deles mudou, se sim - recalcular zn, se não - retornar zn (zn neste caso não zerar e verificar != 0 não será necessário ao imprimir)

A coruja deixa de funcionar, porque se baseia nas variáveis ww e nn, e quando sua função funciona, elas mudam e quebram o algoritmo da coruja.

Nada teria sido compilado se tivesse havido um erro de projeto de código.

Só posso dizer obrigado. Este é o único lugar no runet onde eles me ajudaram.

Agora a impressora gera o seguinte "Stop_Ma_v_5.1 EURUSD,M15: == contagem Z igual a = -nan(ind)" . Você poderia informar o que isso significa e o código deve retornar o número?

Código :

//+------------------------------------------------------------------+
//| Подсчёт 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);
  }
Obrigado
 
aleksandr bebishev:

Pessoal do Mql5, vocês podem me ajudar a fazer um pedido para fechar uma posição em uma conta de hedge? Situação: aberta posição BUY, precisamos fechá-la com Sell Limit. Pergunta: Como faço para escrever corretamente um pedido, para fechar exatamente a posição escolhida e não para abrir um novo bloqueio de VENDA COMPRAR? Por favor, escreva um pedaço de código com comentários! Agradecemos antecipadamente!

Fechamento por uma ordem aberta de outra ordem aberta para o mesmo símbolo, mas em direção oposta.

boolOrderCloseBy(
intticket,// número de ordem para fechar
emoposto,// número da ordem oposta
corseta_color// cor
);

Parâmetros

bilhete

[em] Número de pedido único do pedido a ser fechado.

em frente

[Um número de seqüência único da ordem oposta.

arrow_color

[A cor da seta de fechamento na tabela. Se este parâmetro estiver faltando ou seu valor for CLR_NONE, a seta não é mostrada no gráfico.

Valor retornado

Retorna verdadeiro se a função foi bem sucedida ou falso se houve um erro. Para obter as informações de erro, ligue para GetLastError().

Exemplo:

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

P.S. Esta rosca só analisa MQL4

 
Aliaksei Karalkou:

Só posso dizer obrigado. Este é o único lugar no runet, onde eles ajudaram.

Agora a impressora gera o seguinte "Stop_Ma_v_5.1 EURUSD,M15: == Z-Account Equals = -nan(ind)". Você poderia informar o que isso significa e o código deve retornar o número?

Código :

Obrigado
Nan - NaN - Não é um número - Não é um número. Tente normalizar os números no cálculo Z
 
Aliaksei Karalkou:

O fechamento de uma ordem aberta por outra ordem aberta para o mesmo instrumento, mas na direção oposta.

boolOrderCloseBy(
intticket,// número de ordem para fechar
emoposto,// número da ordem oposta
corseta_color// cor
);

Parâmetros

bilhete

[Um número seqüencial único do pedido sendo fechado.

em frente

[Um número de seqüência único da ordem oposta.

arrow_color

[A cor da seta de fechamento na tabela. Se o parâmetro estiver faltando ou seu valor for CLR_NONE, a seta não é mostrada no gráfico.

Valor retornado

Retorna verdadeiro se a função foi bem sucedida ou falso se houve um erro. Para obter as informações de erro, ligue para GetLastError().

Exemplo:

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

P.S. Esta rosca só analisa MQL4

Não. Quaisquer perguntas sobre mql4 bem como mal5 são tratadas aqui neste tópico, porque o principal objetivo era ajudar não apenas com algoritmos e códigos, mas também facilitar a migração de mql4 para mql5.

Razão: