Como codificar? - página 322

 

Hi,

meu pedido é apenas para informações, no momento.

Se eu tiver um indicador que crie um gráfico offline sem calcular o passado, mas apenas os dados ao vivo, é possível anexá-lo no modelo de teste de estratégia e criar um gráfico offline com os dados do histórico?

Obrigado.

 
mladen:
jayjonbeach,

Você está testando o valor da moeda de tendência repetidamente no loop sem mudá-la (assim, ela sempre retornará NENHUM)

Tente colocar o iCustom() no laço e depois teste esse valor. Algo como isto :

if (trendCurr>0)

{

for(int i=1; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame,"StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

if (testValue<0) return(LONG);

}

return(NONE);

}

Prezado senhor. Tenho apenas duas palavras sobre isto, mas elas suportam a repetição...

OBRIGADO, OBRIGADO e OBRIGADO!!!

De fato, seu código funcionou perfeitamente, e eu aposto que você me poupou mais 12 ou muitas horas de examinar outros loops 'para', tentativas e erros, etc., antes que eu finalmente tropeçasse no que você postou.

Na verdade, eu pensei que queria testar a tendênciaCurrurrente vezes sem conta no loop, mas vejo o erro agora graças a você, e vejo como sua solução de mudar o Stepbartotest com "i" é de fato a solução perfeita, usar "i" aqui é na verdade a chave, mas não parece inteiramente óbvio, pelo menos para um novato como eu poderia ter sido algum tempo antes que eu descobrisse isso...

Enquanto seu código funcionou como pretendido, meu bloco inteiro não está, há um resultado muito interessante não intencional de ter este loop rodando dentro do critério LONG:

if(TwentyOneEMA > FiftyFiveEMA)

{

if (trendCurr>0) // verificar a corrente do filtro de passo

{

se (Licitação > TwentyOneEMA)

{

for(int i=0; i<=lookback; i++)

{

int testValue = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

se (testValue<0) retorno(LONG);

}

retorno(NENHUM);

}

}

}

O que acontece agora, é que quando os "se" são cumpridos, o laço é testado e se for verdade ele compra, se não faz nada, ótimo. Entretanto, todo o bloco de código está agindo como um loop "while", já que enquanto o if(TwentyOneEMA > FiftyFiveEMA) for verdadeiro, o resto do código abaixo dele KEEPS funcionando, e se todas as outras condições se tornarem verdadeiras, o ventoso compra! Eu vejo aqui o erro óbvio da minha estrutura de código.... (estou pensando que outro similar para loop poderia testar os EMA's, para ter certeza de que a cruz de EMA é NOVO)

No entanto, isto não é necessariamente uma coisa ruim (como algumas análises implicariam), na verdade, isto é como o que meu próximo objetivo era, de uma maneira diferente, precisa de muito mais testes, mas por enquanto vou deixar esta revisão no lugar deste robô e começar as próximas revisões em uma cópia.

O que eu ia fazer depois que o fiz olhar para o passado, era se o loop passado se revelasse falso, eu queria que ele verificasse as próximas 10 barras para um sinal de Passo, e se ele se tornasse verdadeiro, pegasse a troca (eu estava pensando em usar um loop de tempo para isto?). Então isto já está acontecendo, exceto que NÃO há limite de 10 barras em seu olhar para frente, e não tenho certeza de como devo estruturar tudo para funcionar corretamente. (Acho que poderia verificar o sinal Step e, se for verdade, procurar uma nova cruz MA nas últimas 10 barras, mas tenho que repetir todo o bloco para isso e acho que deve haver uma maneira mais eficiente/elegante).

Obrigado mais uma vez por sua ajuda, isto vai ser MUITO útil na codificação futura, tenho certeza.

 

Hi,

Eu tento modificar o indicador anexado. Praticamente quando uma pessoa em movimento toca o preço que ela alarma e muda o período de tempo no qual ela é tocada. Coloco um atraso no alarme que é respeito, mas depois de um alarme, se eu mudar o prazo, ele o ignora.

Ele pode ser consertado?

Thank youmedie_mobili.mq4

Arquivos anexados:
 

dasio

Com indicadores você não pode mudar isso. Os indicadores estão redefinindo o escopo global e as variáveis estáticas para valores padrão quando você faz isso, de modo que você não pode manter alguns valores ao alterar o período ou símbolo. Você poderia usar as variáveis globais (aquelas gerenciadas com funções "GlobalVariable...") mas isso tornaria seu código muito complicado (para múltiplas instâncias, múltiplos símbolos, ...) e na minha opinião não vale a pena o esforço

dasio:
Hi,

Eu tento modificar o indicador anexado. Praticamente quando uma pessoa em movimento toca o preço que ela alarma e muda o período de tempo no qual ela é tocada. Coloco um atraso no alarme que é respeito, mas depois de um alarme, se eu mudar o prazo, ele o ignora.

Ele pode ser consertado?

Thank youmedie_mobili.mq4
 

...

Apenas uma adição ao post anterior: uma coisa que não é tão amplamente conhecida - as EAs estão tratando essas variáveis (escopo global e variáveis estáticas) de forma diferente - elas não são zeradas quando o prazo ou símbolo é alterado. Aqui está uma EA muito, muito simples que mostrará àqueles que estão interessados nela como esses valores não são zerados em EAs como em indicadores

int counter = 0;

int init()

{

return(0);

}

int start()

{

static int counterStart = 0;

counterStart++;

counter++;

Comment("counter from start : "+counterStart," counter using global scope : "+counter);

return(0);

}

Isso até é causa de alguns erros em algumas Eas (se a EA não levar em conta que a variável não será redefinida quando o prazo ou símbolo forem alterados, alguns erros muito estranhos no trabalho da EA podem acontecer)

 
mladen:
dasioDo código eu não consigo ver qual é a intenção do código. De qualquer forma, aqui está um código no qual você pode escolher se deseja usar a faixa verdadeira como o valor "básico" do código (é a primeira parte de seu código) ou se deseja usar a segunda parte de seu código como o valor "básico".

Em outro momento, obrigado mladen.

É possível acrescentar outra linha com base nesta condição?

Traçar uma linha horizontal = para a eternidade da Obra[] que são > da Avg[] sempre com base no período de dias?

Obrigado.

 

Alteração do sinal

Olá, Mladen,

Eu quero adicionar sinal de parada de venda ou de parada de compra a este código.....e.g se a linha de sinal estocástico estiver sobre o principal, parar de vender e.t.c,eu adicionei ao código mas não está funcionando...pls ajuda

if(Período()==240)

{

data estática última horaAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

duplo RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0); duplo RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

duplo b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0); double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

duplo b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

duplo nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alertas

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n", Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI<0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n", Symbol());

}

}

 

Você pode tentar algo como isto :

if(Period()==240)

{

static datetime lastAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MOD E_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,M ODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

double RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

double b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

double b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

double nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alerts

alertType = "do nothing";

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&nowtrCCI>b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="buy";

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI <0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trC CI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol()); alertType="sell";

}

if (alertType=="do nothing")

{

lastAlerted=Time[0]; Alert("Stop previous action","\n","Current time is ",TimeToStr(CurTime()),"\n",Symbol());

}

}
Mastercash:
Olá, Mladen,

Eu quero adicionar sinal de parada de venda ou de parada de compra a este código.....e.g se a linha de sinal estocástico estiver sobre o principal, parar de vender e.t.c,eu adicionei ao código mas não está funcionando...pls ajuda

if(Período()==240)

{

data estática última horaAlerted=0;

double ist_main=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_MAIN,0);

double ist_signal=iStochastic(NULL,240,8,3,3,MODE_SMA,0,MODE_SIGNAL,0);

double RSIP1=iRSI(NULL,240,14,PRICE_CLOSE,0);

duplo RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0); duplo RSIP2=iRSI(NULL,240,70,PRICE_CLOSE,0);

duplo b4enCCI=iCCI(NULL,240,6,PRICE_TYPICAL,1);

double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0); double nowenCCI=iCCI(NULL,240,6,PRICE_TYPICAL,0);

duplo b4trCCI=iCCI(NULL,240,14,PRICE_TYPICAL,1);

duplo nowtrCCI=iCCI(NULL,240,14,PRICE_TYPICAL,0);

// alertas

if((ist_main>ist_signal)&&(RSIP1>RSIP2)&&(nowenCCI >0&&nowenCCI>b4enCCI)&&(nowtrCCI>0&&&nowtrCCI>b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Buy Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n", Symbol());

}

if((ist_main<ist_signal)&&(RSIP1<RSIP2)&&(nowenCCI<0&&nowenCCI<b4enCCI)&&(nowtrCCI<0&&nowtrCCI<b4trCCI)&&(lastAlerted!=Time[0]))

{

lastAlerted=Time[0]; Alert("Sell Arrow","\n", "Current time is ",TimeToStr(CurTime()),"\n", Symbol());

}

}
 

Bem, estou preso novamente. Estou tentando corrigir a EA de olhar para o futuro, devido à forma como meu código foi estruturado.

Meu código de sinal começa com um "se", e enquanto isso for verdade, o resto do código seguinte continua executando, como deveria (isto não era um problema antes de inserir o primeiro para loop, mas agora é). Então, tentei um monte de coisas diferentes para corrigir isto, mas nada está funcionando Também verifiquei o manual, mas nada se destacou lá, talvez dois loops "para" no mesmo bloco não seja permitido?

Aqui está o que eu acho que é meu melhor esforço (apenas mostrando LONGO por brevidade), sem erros, mas a EA não faz nenhuma troca, então é provável que eu tenha estragado o loop novamente:

se (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

se (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

se (Bid TwentyOneEMA) // filtro de notícias

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

se (testValue3 <0 && NumOrdens < máximos pedidos) retorno(LONG);

}

retorno(NENHUM);

}

}

}

}

}

==========

Nota: tentei se (testValue1 < testValue2-Separation2) continuar; mas marcou 'continuar' como um erro Se 2 laços não são permitidos, então acho que minha próxima tarefa de adicionar outro laço pode ser mal orientada...

 
jayjonbeach:
Bem, estou preso novamente. Estou tentando corrigir a EA de olhar para o futuro, devido à forma como meu código foi estruturado.

Meu código de sinal começa com um "se", e enquanto isso for verdade, o resto do código seguinte continua executando, como deveria (isto não era um problema antes de inserir o primeiro para loop, mas agora é). Então, tentei um monte de coisas diferentes para corrigir isto, mas nada está funcionando Também verifiquei o manual, mas nada se destacou lá, talvez dois loops "para" no mesmo bloco não seja permitido?

Aqui está o que eu acho que é meu melhor esforço (apenas mostrando LONG para brevidade), sem erros, mas a EA não faz nenhuma troca, então é provável que eu tenha estragado o loop novamente:

se (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

se (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

if (testValue1 < testValue2-Separation2)

{

se (Bid TwentyOneEMA) // filtro de notícias

{

for(i=0; i<=lookback; i++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+i);

se (testValue3 <0 && NumOrdens < máximos pedidos) retorno(LONG);

}

retorno(NENHUM);

}

}

}

}

}

==========

Nota: tentei se (testValue1 < testValue2-Separation2) continuar; mas marcou 'continuar' como um erro Se 2 laços não são permitidos, então acho que minha próxima tarefa de adicionar outro laço pode ser mal orientada...

Ok, acho que descobri, foi a maneira como estruturei o loop, porque as coisas não iriam "terminar" logo após este primeiro loop, ele precisava ser estruturado um pouco diferente do segundo loop, pelo menos essa é a conclusão que cheguei ao olhar para alguns outros bots. O teste rápido mostra o seguinte trabalho, mas mais testes a serem feitos

NumOrdens = CalculateCurrentOrders();

se (NumOrders == 0)

{

if(TwentyOneEMA > FiftyFiveEMA+Separation)

{

se (trendCurr>0)

{

for(int i=0; i<=lookbackma; i++)

{

int testValue1 = iMA(NULL,0,EMA1,0,MODE_EMA,PRICE_CLOSE,i);

int testValue2 = iMA(NULL,0,EMA2,0,MODE_EMA,PRICE_CLOSE,i);

se (testValue1 <! testValue2-Separation2)

{

Imprimir ("No Trade");

pausa;

}

se (Bid TwentyOneEMA) continuar; // filtro de notícias

for(int j=0; j<=lookback; j++)

{

int testValue3 = iCustom(NULL,StepMaTimeFrame, "StepMA_v7",Length,Kv,StepSize,MA_Mode,Advance,Percentage,UpDownShift,HighLow,ColorMode,5,StepMaBarToTest+j);

se (testValue3 <0 && NumOrdens < máximos pedidos) retorno(LONG);

}

retorno(NENHUM);

}

}

}

}

Razão: