Ajuda na codificação - página 143

 
arroganzmaschine:
Hey mladen, mais uma pergunta:

Como posso verificar todas as ordens abertas, se seu lucro é inferior a -20 e fechá-las então?

Algo parecido com isto?

//int currentTicket;

for(int i0=OrdensTotal()-1; i0>=0; i0--) {

//currentTicket = OrderSelect(i0, SELECT_BY_POS, MODE_TRADES);

if(OrderProfit() <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

arroganzmaschine

Sim, isso deve ser suficiente.

Você pode mudar apenas a linha onde você verifica o lucro para isto :

se ((OrderProfit()+OrderSwap()+OrderComission()) <= -20)

para ter certeza de que é um lucro "puro" que você está verificando

 

Tenho que fazer um Bid ou Ask at OrderClose? Ou a linha é correta?

 

Hm, há algo errado. O backtest não fecha as encomendas que estão em lucro negativo. No final do teste, há ordens abertas com -230 de lucro.

 

int start()

{

for(int i0=OrdensTotal()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderComission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Isto não funciona.

 
arroganzmaschine:
int start()

{

for(int i0=OrdensTotal()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderComission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Isto não funciona.

Você esqueceu a OrderSelect() (você sempre tem que selecionar o pedido antes de fazer qualquer coisa com ele). Também seria uma boa idéia adicionar a parte que verifica que tipo de ordem você está tentando fechar

Algo parecido com isto :

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if (OrderSelect(u0,SELECT_BY_POS,MODE_TRADES))

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

{

if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);

if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);

}

 

alguém poderia me ajudar na conversão do histograma em barras no indicador TrendHistogram? Eu gostaria de obter as mesmas barras que as do indicador TrendFilter em anexo

O TrendHistogram precisa do indicador EMA_Adaptativo para funcionar corretamente

Arquivos anexados:
 
freakout:
alguém poderia me ajudar na conversão do histograma em barras no indicador TrendHistogram? Gostaria de obter as mesmas barras do indicador TrendFilter em anexo TrendHistogram precisa do indicador EMA_Adaptativo para funcionar corretamente

freakout

Aqui você vai

Coloque os DrawAsBars em realidade e ele desenhará da maneira que você descreveu. Se você deixar que esse parâmetro seja falso, ele funcionará como o original.

Arquivos anexados:
 

Hi,

Qualquer pessoa pode me ajudar a editar este código de teste de retorno é bom, mas a EA não trabalha em Demo / Real Account.

//+------------------------------------------------------------------+

//| Hans123Trader v1 |

//+------------------------------------------------------------------+

#incluir

#propriedade copyright "hans123"

#ligação de propriedade ""

// programado por fukinagashi

int int externo Início da sessão1=6;(durante o backtest eu edito e defino 0 para todas as sessões, obtendo assim resultados finais)

int exterior EndSession1=10;

int externo InícioSessão2=10;

int externo FimSessão2=14;

duplo TrailingStop externo = 0;

duplo TakeProfit externo = 452;

duplo Exterior InitialStopLoss=40;

duplo Lots = 0,1;

datatime bartime = 0;

duplo Slippage=3;

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start()

{

int cnt, ticket, err, i, j, cmd;

int MagicNumber;

duplo ts, tp, Preço mais baixo, Preço mais alto, Preço;

bool Ordem[5];

configuração de cordas;

data/hora Validade=0;

if(IsTesting() && Bars<100) retorno(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Símbolo();

se (bartime == Tempo[0]) {

retorno(0);

} else {

bartime = Tempo[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICAÇÕES EM PEDIDOS ABERTOS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=OrdensTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Erro ao fechar pedido de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Imprimir("Erro modificando pedido de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

if (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Error closing Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

if (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DEFINIÇÃO DE PEDIDOS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) retorno(0);

Validity=StrToTime(TimeYear(Time[0])) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + "." 23:59");

if (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

Preço mais alto=Alto;

//// o seguinte é necessário, para evitar um preço BUYSTOP/SELLSTOP que está muito próximo de Bid/Ask,

//// neste caso, obtemos 130 paradas inválidas.

//// Eu experimentei mudar para OP_BUY e OP_SELL, mas os resultados não foram satisfatórios.

//if (Preço mais alto+5*Point<Ask+Spread*Point) {

//cmd=OP_BUY;

//Price=Ask;

//} else {/} else {

cmd=OP_BUYSTOP;

Preço=Preço mais alto+5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (Preço mais baixo - 5*Ponto>Bid-Spread*Ponto) {

//cmd=OP_SELL;

//Price=Bid;

//} else {/} else {

cmd=OP_SELLSTOP;

Preço=Preço mais baixo - 5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

Preço mais alto=Alto;

//if (Preço mais alto+5*Point<Ask+Spread*Point) {

//cmd=OP_BUY;

//Price=Ask;

//} else {/} else {

cmd=OP_BUYSTOP;

Preço=Preço mais alto+5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (Preço mais baixo -5*Ponto>Bid-Spread*Ponto) {

//cmd=OP_SELL;

//Price=Bid;

//} else {/} else {

cmd=OP_SELLSTOP;

Preço=Preço mais baixo - 5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSAS SUB-ROTINAS /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") {retorno(01);

} else if(symbol==="CHFJPY") {return(10);

} else if(symbol=="EURAUD") {return(10);

} else if(symbol=="EURCAD") {retorno(11);

} else if(symbol=="EURCHF") {return(12);

} else if(symbol=="EURGBP") {return(13);

} else if(symbol=="EURJPY") {return(14);

} else if(symbol=="EURUSDm") {return(15);

} else if(symbol==="GBPCHF") {return(20);

} else if(symbol=="GBPJPY") {return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") {retorno(40);

} else if(symbol=="USDCHF") {retorno(41);

} else if(symbol=="USDJPY") {return(42);

} else if(symbol=="GOLD") {return(90);

} else {Comment("unexpected Symbol"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

data/hora OldCurTime;

int timeout=30;

int ticket;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Imprimir("Erro no PedidoEnviadoExtendido(): Timeout encontrado");

retorno(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // definir indicador de bloqueio

bilhete = OrderSend(symbol, cmd, volume, preço, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // indicador de bloqueio claro

retorno(bilhete);

}

 
ccd:
Hi,

Qualquer pessoa pode me ajudar a editar este código de teste de retorno é bom, mas a EA não trabalha em Demo / Real Account.

//+------------------------------------------------------------------+

//| Hans123Trader v1 |

//+------------------------------------------------------------------+

#incluir

#propriedade copyright "hans123"

#ligação de propriedade ""

// programado por fukinagashi

int int externo Início da sessão1=6;(durante o backtest eu edito e defino 0 para todas as sessões, obtendo assim resultados finais)

int exterior EndSession1=10;

int externo InícioSessão2=10;

int externo FimSessão2=14;

duplo TrailingStop externo = 0;

duplo TakeProfit externo = 452;

duplo Exterior InitialStopLoss=40;

duplo Lots = 0,1;

datatime bartime = 0;

duplo Slippage=3;

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start()

{

int cnt, ticket, err, i, j, cmd;

int MagicNumber;

duplo ts, tp, Preço mais baixo, Preço mais alto, Preço;

bool Ordem[5];

configuração de cordas;

data/hora Validade=0;

if(IsTesting() && Bars<100) retorno(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Símbolo();

se (bartime == Tempo[0]) {

retorno(0);

} else {

bartime = Tempo[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// MODIFICAÇÕES EM PEDIDOS ABERTOS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=OrdensTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Erro ao fechar pedido de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Imprimir("Erro modificando pedido de compra [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

if (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Imprimir(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Error closing Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

if (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DEFINIÇÃO DE PEDIDOS ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) retorno(0);

Validity=StrToTime(TimeYear(Time[0])) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + "." 23:59");

if (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

Preço mais alto=Alto;

//// o seguinte é necessário, para evitar um preço BUYSTOP/SELLSTOP que está muito próximo de Bid/Ask,

//// neste caso, obtemos 130 paradas inválidas.

//// Eu experimentei mudar para OP_BUY e OP_SELL, mas os resultados não foram satisfatórios.

//if (Preço mais alto+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

// Preço=Ask;

//} else {/} else {/

cmd=OP_BUYSTOP;

Preço=Preço mais alto+5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (Preço mais baixo - 5*Ponto>Bid-Spread*Ponto) {

// cmd=OP_SELL;

// Price=Bid;

//} else {/} else {

cmd=OP_SELLSTOP;

Preço=Preço mais baixo - 5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

Preço mais alto=Alto;

//if (Preço mais alto+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

// Preço=Ask;

//} else {/} else {/

cmd=OP_BUYSTOP;

Preço=Preço mais alto+5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (Preço mais baixo -5*Ponto>Bid-Spread*Ponto) {

// cmd=OP_SELL;

// Price=Bid;

//} else {/} else {

cmd=OP_SELLSTOP;

Preço=Preço mais baixo - 5*Ponto;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Imprimir("Erro modificando ordem de venda [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// DIVERSAS SUB-ROTINAS /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01);

} else if(symbol=="CHFJPY") { return(10);

} else if(symbol=="EURAUD") { return(10);

} else if(symbol=="EURCAD") { return(11);

} else if(symbol=="EURCHF") { return(12);

} else if(symbol=="EURGBP") { return(13);

} else if(symbol=="EURJPY") { return(14);

} else if(symbol=="EURUSDm") { return(15);

} else if(symbol=="GBPCHF") { return(20);

} else if(symbol=="GBPJPY") { return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") { return(40);

} else if(symbol=="USDCHF") { return(41);

} else if(symbol=="USDJPY") { return(42);

} else if(symbol=="GOLD") { return(90);

} else { Comment("unexpected Symbol"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

data/hora OldCurTime;

int timeout=30;

int ticket;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Imprimir("Erro no PedidoEnviadoExtendido(): Timeout encontrado");

retorno(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // definir indicador de bloqueio

bilhete = OrderSend(symbol, cmd, volume, preço, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // indicador de bloqueio claro

retorno(bilhete);

}

Tente multiplicar o InitialStopLoss por 10 em uma conta ativa. Essa EA é escrita para corretores de 4 dígitos

______________________

PS : você também deve multiplicar o TakeProfit por 10 para ser consistente e ter isso como pips, mas se você o testou com esses números, você não obterá os mesmos resultados que nos testes anteriores (simplesmente porque o teste anterior permitiu que você usasse valores para aqueles dois que nem a conta demo nem a conta ativa lhe permitirão)

 
mladen:
zigflipLast dois psar como em "último par de psar superior/inferior" ou "últimas 2 barras"?

Desculpe pelo atraso na resposta mladen, pensei que tinha uma assinatura por e-mail, mas...

Quero dizer, o último par de salmões!

Eu quero principalmente monitorar o último psar, mas quando ocorrer a mudança de cima para baixo precisaria dos dois últimos níveis, hmm talvez devessem ser x barras de volta... agh vejo o que você diz agora, em segundos pensamentos talvez o último conjunto de altos/baixos, que se apara para a última mudança na chegada do primeiro novo psar de direção!

Obrigado por sua ajuda nisto,

Razão: