Ajuda na codificação - página 39

 

Eu escrevi esta linha de código.

int TriggerChart = PERÍODO_H4;

int FastMACDPeriod = 12;

int SlowMACDPeriod = 26 ;

int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

Com estas variáveis inseridas estou me perguntando se a EA é capaz de identificar que o TriggerChart é 'int timeeframe', e as outras usadas para os períodos int? Será que onde eles estão todos juntos, por exemplo, ele olha para o TriggerChart e FastMACDP period e acha que ambos têm a ver com o período int e fica confuso? Em que momento a EA reconhece qual variável se aplica a qual parte do iMACD?

 

...

Em resumo : não, não pode ficar confuso (os computadores são bons nisso, não pensam, mas executam as mesmas coisas repetidamente sem interpretar) Apenas os codificadores ficam confusos de tempos em tempos

Quando você chama uma função, ela aceita parâmetros em determinada ordem (lugares (por exemplo: primeiro parâmetro é símbolo, secind é período, e assim por diante) É completamente relevante como você declara (tipos) as variáveis quando você chama uma função: elas são estritamente usadas dependendo de seu lugar na lista de chamada de parâmetros

crsnape@btinternet.com:
Eu escrevi esta linha de código.

int TriggerChart = PERÍODO_H4;

int FastMACDPeriod = 12;

int SlowMACDPeriod = 26 ;

int SignalPeriod = 9; int SignalPeriod = 9;

MacdCurrent = iMACD(Symbol(), TriggerChart, FastMACDPeriod,SlowMACDPeriod,SignalPeriod, PRICE_CLOSE, MODE_MAIN, 1);

Com estas variáveis inseridas estou me perguntando se a EA é capaz de identificar que o TriggerChart é 'int timeeframe', e os outros usados para os períodos int? Será que onde eles estão todos juntos, por exemplo, ele olha para o TriggerChart e FastMACDP period e acha que ambos têm a ver com o período int e fica confuso? Em que momento a EA reconhece qual variável se aplica a qual parte do iMACD?
 

Obrigado mladen. Parece lógico.

Com este código, declarei BarsGV como 0 na função int init(). Mas, como você diz corretamente, se eu receber um erro, ele ainda retorna falso. Basta pensar que em vez de declará-lo 0 no int init() eu poderia redefini-lo para 1 em vez disso. O que você acha? Eu tenho um 200SMA e se o Bars tiver menos de 200, ele detecta um erro aqui de qualquer forma.

Portanto, ao invés disto:

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

retorno(0);

}

ISTO ESTÁ SOB INT START()

se ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, falso);

GlobalVariableSet(BarsGV, Bars);

}

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

Mude para isso:

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

retorno(0);

}

ISTO ESTÁ SOB INT START()

se (GlobalVariableGet (BarsGV) == 0);

{

Print("Error with Global Variable BarsGV", GetLastError()));

return(0);

}

se (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, falso);

GlobalVariableSet(BarsGV, Bars);

}

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

O que você acha?

 

...

Mudar para este :

int BarsGV;

bool HasOrderedGV;

int init()

{

//---

BarsGV=0;

HasOrderedGV=false;

//---

return(0);

}

THIS IS UNDER INT START()

if (BarsGV < Bars)

{

HasOrderedGV=false;

BarsGV=Bars;

}

//--- Check for long position (BUY) possibility

if (HasOrderedGV == false)

{[/PHP]

That way you are going to avoid other EA interference and you will keep the variables to only one instance of Ea (they can not mix at all). Much better to do it that way (even from the speed of execution point of view). But you still risk of opening a new order on a same bar this way. The best way is to use a function to count orders opened at the current bar and then allow or disallow ner order opening

Here is a function that can do that (it will check currently opened as well as already closed orders if they have been opened on a current bar) :

bool uniqueOnBar(int MagicNumber)

{

datetime startTime = Time[0];

datetime endTime = startTime+60*Period();

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

for (i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}

Checking would be very simple :

[PHP]if (uniqueOnBar(MagicNumber)) .... you can open an a new order

Dessa forma, você não dependeria de nenhuma variável, mas apenas de ordens e essa é a única forma 100% confiável

crsnape@btinternet.com:
Obrigado mladen. Parece lógico.

Com este código declarei o BarsGV como 0 na função int init(). Mas, como você diz corretamente, se eu receber um erro, ele ainda retorna falso. Basta pensar que ao invés de declará-lo 0 no int init() eu poderia redefini-lo para 1 em vez disso. O que você acha? Eu tenho um 200SMA e se o Bars tiver menos de 200, ele detecta um erro aqui de qualquer maneira.

Portanto, ao invés disto:

int init()

{

//---

GlobalVariableSet (BarsGV, 0);

//---

retorno(0);

}

ISTO ESTÁ SOB INT START()

se ((GlobalVariableGet (BarsGV) == 0) || (GlobalVariableGet (BarsGV) < Barras)

{

GlobalVariableSet(HasOrderedGV, falso);

GlobalVariableSet(BarsGV, Bars);

}

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

Mude para isso:

int init()

{

//---

GlobalVariableSet (BarsGV, 1);

//---

retorno(0);

}

ISTO ESTÁ SOB INT START()

se (GlobalVariableGet (BarsGV) == 0);

{

Print("Error with Global Variable BarsGV", GetLastError()));

return(0);

}

se (GlobalVariableGet (BarsGV) < Bars)

{

GlobalVariableSet(HasOrderedGV, falso);

GlobalVariableSet(BarsGV, Bars);

}

//--- Verificar a possibilidade de posição longa (BUY)

se (GlobalVariableGet (HasOrderedGV) == falso)

{

O que você acha?
 

Superstar. Obrigado.

 

Oi mladen,

Esta parte:

data/hora FimTempo = InícioTempo + 60 * Período();

Is Period() é nesta instância o cronograma do gráfico. Então diga H4 (240) * 60 porque EndTime é registrado em segundos, então a conversão de 240 minutos em segundos para corresponder com minutos de Período (240)?

Estou lendo isso corretamente?

Poderia também ser escrito:

datatime EndTime = (StartTime / 60) + Período();?

 

...

Sim, você está lendo bem

A partir da outra forma : você não pode usar isso, já que o OrderOpenTime() está em um formato padrão de data/hora, o que significa que no EndTime você deve ter o número de segundos passados desde 1 de janeiro de 1970 e a forma como você o escreveu conteria minutos - metatrader assumiria que esses são segundos e isso daria todos os resultados errados

crsnape@btinternet.com:
Oi mladen,

Esta parte:

data/hora FimTempo = InícioTempo + 60 * Período();

Is Period() é nesta instância o cronograma do gráfico. Então diga H4 (240) * 60 porque EndTime é registrado em segundos, então a conversão de 240 minutos em segundos para corresponder com minutos de Período (240)?

Estou lendo isso corretamente?

Poderia também ser escrito:

data/hora FimTempo = (InícioTempo / 60) + Período();?
 

Olá mladen, o laço aqui seleciona o último pedido aberto ou pendente?

bool UniqueOnBar (int MagicNumber)

{

data/hora InícioTempo = Hora[0];

data/hora de término = Hora de início + 60 * Período (TriggerChart);

para (int i = OrderTotal() - 1; i >= 0; i--)

{

se (!OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continuar;

se (OrderSymbol() != Symbol()) continuar;

se (OrderMagicNumber() != MagicNumber) continuar;

if (OrderOpenTime() endTime) continue;

return(false);

}

Portanto, onde o ponto de exclamação é interpretado como "não", eu acho que isso não é correto, porque eu quero:

- Selecionar a última ordem aberta ou pendente, então remova! para deixar OrderSelect?

- OrderSymbol() para ser o mesmo que Symbol()

- OrderMagicNumber() para ser igual ao MagicNumber, então...deixa isto:

intTriggerChart= PERÍODO_H4;

int MagicNumber = 42;

bool UniqueOnBar (int MagicNumber)

{

data/hora InícioTempo = Hora[0];

data/hora de término = Hora de início + 60 * Período(TriggerChart);

para (int i = OrderTotal() - 1; i >= 0; i--)

{

se (OrderSelect (i, SELECT_BY_POS, MODE_TRADES)) continuar;

se (OrderSymbol() == Symbol()) continuar;

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() endTime) continue; if (OrderOpenTime() endTime) continue;

return(false);

}

 

Minha supervisão percebo agora que é quando a expressão retorna verdadeira que nenhuma ordem aberta é capturada no bar atual.

 

...

Sim, ela o faz. Então, se ele retornar verdadeiro, você pode abrir um novo pedido

Além disso, se você quiser testar um período de tempo diferente do atual se uma ordem foi aberta na barra de tempo alvo, então a função pode ser alterada para algo como isto :

bool UniqueOnBar (int MagicNumber, int timeFrame=0)

{

if (timeFrame==0) timeFrame=Period();

datetime StartTime = iTime(NULL,timeFrame,0);

datetime EndTime = StartTime + 60*timeFrame;

for (int i=OrdersTotal()-1; i>=0; i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;

if (OrderSymbol() == Symbol()) continue;

if (OrderMagicNumber() == MagicNumber) continue;

if (OrderOpenTime() EndTime) continue;

return(false);

}

return(true);

}

[/PHP]

And then the call to it would be for your example 2 posts ago

[PHP]if (UniqueOnBar(MagicNumber,TriggerChart) ... open an order

PS: você removeu a verificação de ordens fechadas do exemplo. Se você deseja verificar as ordens fechadas também, então use também a segunda parte da forma original da função

crsnape@btinternet.com:
Minha supervisão percebo agora que é quando a expressão retorna verdadeira que nenhuma ordem aberta é capturada no bar atual.