Como codificar? - página 284

 

Classificei uma solução para o filtro de tempo Fechar tudo

Variáveis externas

extern string timefilter="Time Filter";

extern int gmtshift=1; // gmt offset of the broker

extern bool generalfilter=false; // enable time filter

extern int starthour=7; // start hour to trade after this hour

extern int startminutes=0; // minutes of the start hour

extern int endhour=21; // stop to trade after this hour

extern int endminutes=0; // minutes of the start hour

extern bool tradesunday=true; // trade on sunday

extern bool fridayfilter=false; // enable special time filter on friday

extern int fridayhour=21; // stop to trade after this hour

extern int fridayminutes=0; // minutes of the friday hour

[/CODE]

int nstarthour,nendhour,nfridayhour;

string istarthour,istartminutes,iendhour,iendminutes,ifridayhour,ifridayminutes;

datetime tstart,tend,tfriday;[/CODE]

Place Code in Start,

[CODE] if(generalfilter){

nstarthour=starthour+(gmtshift);if(nstarthour>23)nstarthour=nstarthour-24;

if(nstarthour<10)istarthour="0"+nstarthour;

if(nstarthour>9)istarthour=nstarthour;

if(startminutes<10)istartminutes="0"+startminutes;

if(startminutes>9)istartminutes=startminutes;

tstart=StrToTime(istarthour+":"+istartminutes);

nendhour=endhour+(gmtshift);if(nendhour>23)nendhour=nendhour-24;

if(endhour<10)iendhour="0"+nendhour;

if(endhour>9)iendhour=nendhour;

if(endminutes<10)iendminutes="0"+endminutes;

if(endminutes>9)iendminutes=endminutes;

tend=StrToTime(iendhour+":"+iendminutes);

}

if(fridayfilter){

nfridayhour=fridayhour+(gmtshift);if(nfridayhour>23)nfridayhour=nfridayhour-24;

if(nfridayhour<10)ifridayhour="0"+nfridayhour;

if(nfridayhour>9)ifridayhour=nfridayhour;

if(fridayminutes<10)ifridayminutes="0"+fridayminutes;

if(fridayminutes>9)ifridayminutes=fridayminutes;

tfriday=StrToTime(ifridayhour+":"+ifridayminutes);

}

if((generalfilter && (nstarthour<nendhour && TimeCurrent()tend) || (nstarthour>nendhour && TimeCurrent()tend))

|| (tradesunday==false && DayOfWeek()==0) || (fridayfilter && DayOfWeek()==5 && TimeCurrent()>tfriday))

{

CloseAll();

Comment("Non-trading Hours All Positions Closed");

return(0);

}

and the CloseAll function.

[CODE]

void CloseAll(){

int total = OrdersTotal();

for(int i=total-1;i>=0;i--){

OrderSelect(i, SELECT_BY_POS);

int type = OrderType();

bool result = false;

switch(type){

//Close opened long positions

case OP_BUY : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Lime); break;

//Close opened short positions

case OP_SELL : result = OrderClose( OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, LightGreen );

} if(result == false){

Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );

Sleep(3000);

}

}

return(0);

}

obrigado pelas dicas e dicas Kalenzo

 

StopLoss

Gidday

Tenho tentado um experimento para calcular um SL com base no valor do tick a max dd e porcentagem por comércio.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

A idéia é que, dependendo do par e dos pares, o valor do tick individual e o tamanho do lote pode ser definido.

Acho que está certo, mas gostaria que alguém o verificasse, se possível.

 
Beno:
Gidday

Tenho tentado um experimento para calcular um SL com base no valor do tick a max dd e porcentagem por comércio.

double lotSize = NormalizeDouble(Kellylot(),2);

double Pip = Point;

if(Digits==3 || Digits==5) Pip = 10*Point;

double Bal = AccountBalance(); // $1000

double TV = MarketInfo(Symbol(), MODE_TICKVALUE); // $1

double Risk = 2; // 2%

double MaxDD = 10; // 10%

double RiskCapital = Bal*MaxDD/100; // Total Exposure 10% of $1000 = $100

double RPT = Bal*Risk/100; // 2% of $1000 = $20

double stopLoss = NormalizeDouble(RPT/TV*lotSize/Pip,Digits); //$20/1*0.01/10 = 0.02000

double Positions = MathAbs(RiskCapital/RPT); // Maximum 5 positions 100 / 20

A idéia é que, dependendo do par e dos pares, o valor do tick individual e o tamanho do lote pode ser definido.

Acho que é um direito, mas gostaria que alguém o verificasse, se possível.

Bom trabalho, Beno,

É sempre melhor dar cana de pesca do que peixe. Estou muito feliz por poder ajudá-los com alguns comentários.

Quanto à parada de perda, a idéia é boa, mas tente também considerá-la de forma inversa:

primeira parada de perda definida

segundo tamanho comercial definido

Desta forma, você ajustará a entrada/saída do sistema às condições do mercado, e não arriscará mais do que X% de sua conta, mas a saída dependerá da lógica do sistema em vez do percentual de risco.

 
Kalenzo:
Bom trabalho Beno,

É sempre melhor dar cana de pesca do que peixe. Estou muito feliz por poder ajudá-los com alguns comentários.

Quanto à parada de perda, a idéia é boa, mas tente também considerá-la de forma inversa:

primeira parada de perda definida

segundo tamanho comercial definido

Desta forma, você ajustará a entrada/saída do sistema às condições do mercado, e não arriscará mais do que X% de sua conta, mas a saída dependerá da lógica do sistema em vez do percentual de risco.

Gidday Kalenzo

Estou recebendo um pedido de VENDA de abertura de erro: paradas inválidas com a EA estão na conta demo e ao vivo e nenhuma negociação está abrindo. mas funciona bem com o testador e não tem mensagens de erro.

EURUSD,Daily: modificar #1 comprar 0.01 EURUSD a 1.43348 sl: 1.43895 tp: 0.00000 ok

A diferença de pontos SL 0,00547

Eu verifiquei o

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Eu nunca passei por isso antes.

Saúde

Beno

 

Função Latch/Unlatch

Existe uma maneira de codificar uma função de travamento/destravamento em mq4. Você travaria um pouco verdadeiro com base em uma condição e armazenaria este valor até ser destravado por outra condição.

cmfxtrader

 
Beno:
Gidday Kalenzo

Estou recebendo um pedido de VENDA de abertura de erro: paradas inválidas com a EA estão na conta demo e ao vivo e nenhuma negociação está abrindo. mas funciona bem com o testador e não tem mensagens de erro.

EURUSD,Daily: modificar #1 comprar 0.01 EURUSD a 1.43348 sl: 1.43895 tp: 0.00000 ok

A diferença de pontos SL 0,00547

Eu verifiquei o

MODE_FREEZELEVEL 0.0000

MODE_STOPLEVEL 0.0000

double lotSize = NormalizeDouble(Kellylot(),2);

double Bal = AccountFreeMargin();

double TV = MarketInfo(Symbol(), MODE_TICKVALUE);

double Risk = 0.3;

double MaxDD = 10;

double RiskCapital = Bal*MaxDD/100;

double RPT = Bal*Risk/100;

double stopLoss = NormalizeDouble((RPT/TV)*lotSize/pips2dbl,Digits);

double Positions = MathAbs(RiskCapital/RPT);

double SL;

//---- sell conditions

if(sellsig && ttime!=Time[0]){

double bid = NormalizeDouble(Bid, Digits);

SL = NormalizeDouble(Bid + stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_SELL,lotSize,bid,slippage * pips2dbl,SL,0,"Pivot_Sell",SpecificMagic,0,Red);

if( res<0 )

{

Print("Error opening SELL order : ",ErrorDescription(GetLastError()));

Print("Bid=" + DoubleToStr(bid,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Bid, SL, 0, 0, Red))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

//---- buy conditions

if(buysig && ttime!=Time[0]) {

double ask = NormalizeDouble(Ask, Digits);

SL = NormalizeDouble(Ask - stopLoss * pips2dbl, Digits);

res=OrderSend(symbol,OP_BUY,lotSize,ask,slippage * pips2dbl,SL,0,"Pivot Buy",SpecificMagic,0,Blue);

if( res<0 )

{

Print("Error opening BUY order : ",ErrorDescription(GetLastError()));

Print("Ask=" + DoubleToStr(ask,Digits) + " : SL=" + DoubleToStr(SL,Digits));

res=0;

}

else //now enter in the SL and TP via OrderModify to make compatible with ECN broker

{

if (OrderSelect(res, SELECT_BY_TICKET))

{

if (!OrderModify(res, Ask, SL, 0, 0, Blue))

Print("Error modifying order");

}

}

ttime=Time[0];

return;

}

}

Eu nunca passei por isso antes.

Saúde

Beno

Provavelmente seu stop loss está muito próximo. Tente multiplicar o valor de stop loss por 10. É um problema freqüente quando você estava testando o sistema em um corretor de 4 dígitos e o está negociando em um corretor de 5 dígitos. Você também poderia testá-lo em um corretor de 5 dígitos, mas nunca conectá-lo ao corretor (em modo offline) e então o metatrader terá configurações antigas (a partir de 4 dígitos).

Primeiro a partir desta linha:

NormalizeDouble(Ask - stopLoss * pips2dbl, Dígitos);

Imprima este valor => stopLoss*pips2dbl

então você conhecerá o valor real do stop loss.

se será como 20 ou 10 então significa que você precisará multiplicá-lo pelo valor do ponto

NormalizeDouble(Ask - (stopLoss * pips2dbl) *Point, Digits);

se será como 0,00009 então você precisa multiplicar por 10 porque deve ser 0,0009 (claro que se você deseja definir 9 pips stop loss)

 
cmfxtrader:
Existe uma maneira de codificar uma função de travamento/destravamento em mq4. Você travaria um pouco verdadeiro com base em uma condição e armazenaria este valor até ser destravado por outra condição.cmfxtrader

Não tenho certeza se o entendi bem. Você deseja ligar/desligar parte específica de ea(função) ou deseja desativar a função de ea A através da ação tomada em ea B ? Desta forma ou de outra forma, ambas são possíveis.

 

Converter valor monetário em preço (para cálculo da meta de lucro)

Eu gostaria de programar uma função que devolva um valor de preço para uma determinada meta de lucro de uma cesta de ofícios, mas estou tendo dificuldades. A meta que eu gostaria de atingir, é uma linha horizontal simples a ser desenhada na tela que indica a meta de lucro. Entretanto, a meta de lucro é uma variável definível pelo usuário na forma de um valor monetário e não de um valor de preço. (por exemplo, meta = 100 euros em vez de meta = 1,2000)

A rotina que eu tenho até agora:

(Minha conta está em EUR!)

1) Digamos que eu abro várias posições de compra para o USDJPY (em posições aleatórias para criar uma situação de exemplo)

2) Calculo o preço médio da cesta aberta (digamos 1.1500, mais uma vez hipotéticamente) e mostro uma linha horizontal para indicar isso

3) Eu tenho uma variável com uma meta de lucro definida: digamos meta = 100 euros

4) Eu posso fechar com sucesso todas as posições abertas quando a cesta lucrativa >= alvo

Falta o passo intermediário. Preciso de uma função: duplo targetPrice(){} que retorna o targetPrice. Desenhar a linha horizontal não é o problema: calcular o preço-alvo é!

O preço-alvo = preço médio aberto + alvo de valor monetário (100 euros)

Então o que eu basicamente gostaria de saber: como converter um valor monetário em gratificações. Desta forma, posso adicionar os pips ao preço médio e voilá tenho meu preço-alvo. Lembre-se que isto também tem que levar em conta o fato de que tenho uma conta em EUR e estou negociando USDJPY. Acho que também há armadilhas?

 

ECN SL não funciona

Gidday

Estou tentando montar um EA que funcionará em um ECN, entendo que o SL e TP devem ser colocados / modificados e acho que a configuração está correta, o pedido abre agora, mas o SL não é colocado externamente o StopLoss duplo = 100; qualquer ajuda seria ótima.

//---- buy conditions

if(buysig && ttime!=Time[0]) {

ticket = OrderSend(Symbol(), OP_BUY, lotSize, MarketInfo(Symbol(), MODE_ASK), 2, 0, 0, "", 12345);

if(ticket > -1){

if (!OrderSelect(ticket, SELECT_BY_TICKET)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("order "+ticket+" successfully opened");

//now enter in the SL and TP via OrderModify to make compatible with ECN broker

SL = MarketInfo(Symbol(), MODE_ASK) - (StopLoss * pips2points);

Print("Ask = " + DoubleToStr(Ask,Digits) + " : SL = " + DoubleToStr(SL,Digits));

//round to nearest Tickvalue

SL = DoubleRound(SL, MarketInfo(Symbol(), MODE_TICKSIZE));

Print("SL rounded: " + SL);

if(!OrderModify(ticket, entry_price, SL, 0, Blue)) {

error_code = GetLastError();

Print("Error: " + ErrorDescription(error_code));

return(-1);

}

Print("Stoploss successfully set");

ttime=Time[0];

return(0);

}

}

}

//Tickvalue Rounding

double DoubleRound(double number, double step){

double mod = MathMod(number, step);

if(mod < step/2.0)

step = 0;

double rounded = number - mod + step;

return (rounded);

}
 

,,,,,,,,,,,,,.,,,,,,,,,

Arquivos anexados:
test_ea.txt  10 kb
aizig.ex4  10 kb