apenas comprar, não vender

criando uma ea lucrativa, mas poderia ser duas vezes melhor (talvez) por enquanto só são feitas compras, nunca vendas de encomendas.

Alguém sabe por quê?

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

//| Início do sinal |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

duplo Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Ordem = SINAL_BUY;

if (sig_sell>0 && Sg<0 ) Ordem = SINAL_SELL;

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

//| Fim do sinal |

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

publicar o código total, há outra coisa errada...

o segundo passo talvez seja suas funções iCustom().

panteraschoice:
criando uma ea lucrativa, mas poderia ser duas vezes melhor (talvez) por enquanto só são feitas compras, nunca vendas de pedidos.

Alguém sabe por quê?

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

//| Início do sinal |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

duplo Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Ordem = SINAL_BUY;

if (sig_sell>0 && Sg<0 ) Ordem = SINAL_SELL;

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

//| Fim do sinal |

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

Colocando e Visualizando Objetos em Datas Futuras?

Olá, alguém sabe se a MQL4 suporta colocar um objeto indicador no futuro e visualizar o objeto futuro? Eu tentei ObjectMove para uma data futura (sem retorno de erro), mas a visualização pára na última data do tick. Obrigado

Os MA têm uma característica de turno... se é isso que você quer dizer. +2 o deslizará para a frente 2 barras TF. -2 irá deslizar para trás 2.

IN10TION:
publicar o código total, há outra coisa errada...o segundo passo talvez seja suas funções iCustom().

#link da propriedade "https://www.forex-tsd.com"

número interno externo MagicNumber = 1001;

bool externo EachTickMode = Falso;

double Lots externo = 0,01;

Exterior int Slippage = 4;

bool StopLossMode externo = Verdadeiro;

StopLoss int externo = 70;

bool TakeProfitMode externo = Verdadeiro;

extern int TakeProfit = 300;

bool TrailingStopMode = Verdadeiro; bool StopLossMode = Verdadeiro;

Exterior int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

duplo DiminuiçãoFator externo =3;

Exterior int MaxOrders = 3000;

externo bool UseHourTrade = Falso;

extern int FromHourTrade = 8;

externo int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

no BarCount;

int Corrente;

bool TickCheck = Falso;

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

//| função de iniciação de especialista |

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

int init() {

BarCount = Barras;

se (CadaTickMode) Corrente = 0; caso contrário Corrente = 1;

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit() {

retorno(0);

}

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

//| função de início especializado |

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

int start() {

se (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comentário ("Não chegou a hora do comércio!");

retorno(0);

}

}

int Ordem = SIGNAL_NONE;

int Total, Bilhete;

nível duplo StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

if (CadaTickMode && Bars != BarCount) CadaTickMode = Falso;

Total = OrdensTotal();

Order = SIGNAL_NONE;

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

//| Início do sinal |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

duplo Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Ordem = SINAL_BUY;

if (sig_sell>0 && Sg<0 ) Ordem = SINAL_SELL;

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

//| Fim do sinal |

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

//Compra

if (Order === SIGNAL_BUY && ((EachTickMode && !TickCheck) ||| (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Cheque margem livre

if (AccountFreeMargin() < (1000 * Lotes)) {

Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin());

devolução(0);

}

StopLossLevel = Perguntar - StopLoss * Ponto;

TakeProfitLevel = Ask + TakeProfit * Ponto;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDuplo(Pergunte,dígito),

Slippage,

NormalizeDuplo(StopLossLevel,digit),

NormalizeDuplo(TakeProfitLevel,digit),

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Ticket > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Imprimir("ordem de compra aberta : ", OrderOpenPrice()); ou Imprimir("erro de abertura da ordem de compra: ", GetLastError()));

}

se (EachTickMode) TickCheck = Verdadeiro;

se (!EachTickMode) BarCount = Bars;

return(0);

}

}

//vender

if (Order === SIGNAL_SELL && ((EachTickMode && !TickCheck) ||| (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Cheque margem livre

if (AccountFreeMargin() < (1000 * Lotes)) {

Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin());

devolução(0);

}

StopLossLevel = Bid + StopLoss * Ponto;

TakeProfitLevel = Bid - TakeProfit * Ponto;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDuplo(Bid,digit),

Slippage,

NormalizeDuplo(StopLossLevel,digit),

NormalizeDuplo(TakeProfitLevel,digit),

"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(Ticket > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Imprimir("Pedido de VENDA aberto : ", OrderOpenPrice()); ou Imprimir("Erro na abertura do pedido de VENDA : ", GetLastError()));

}

se (EachTickMode) TickCheck = Verdadeiro;

se (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Cheque posição

para (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//Close

if (Order === SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

se (EachTickMode) TickCheck = Verdadeiro;

if (!EachTickMode) BarCount = Bars;

return(0);

}

// Parada de trilha

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Ponto * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

se (!EachTickMode) BarCount = Bars;

retorno(0);

}

}

}

{} else {

if(OrderType()==OP_SELLL && OrderMagicNumber()==MagicNumber)

{

//Close

if (Order === SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

se (EachTickMode) TickCheck = Verdadeiro;

if (!EachTickMode) BarCount = Bars;

return(0);

}

// Parada de trilha

se (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - Ask) > (Ponto * TrailingStop)) {

if((OrderStopLoss() > (Pergunte + Ponto * TrailingStop)) ||| (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

se (!EachTickMode) BarCount = Bars;

retorno(0);

}

}

}

}}

}

}

se (!EachTickMode) BarCount = Bars;

retorno(0);

}

int ScanTrades()

{

int total = EncomendasTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

retorno(numords);

}

//bool ExistPosições() {

//for (int i=0; i<OrdersTotal(); i++) {

//if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {

//if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

//retorno(Verdadeiro);

//}

//}

//}

//retorno(falso);

//}

duplo LotsOptimized()

{

lote duplo=Lotes;

int orders=HistoryTotal(); // histórico total de ordens

int losses=0; // número de ordens de perdas sem intervalo

//---- selecione o tamanho do lote

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- calcule o número de ordens de perdas sem uma pausa

if(DiminaseFactor>0)

{

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==falso) { Print("Erro na história!"); break; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELLL) continua;

//----

if(OrderProfit()>0) quebra;

if(OrderProfit()<0) perdas++;

}

if(perdas>1) lote=NormalizarDuplo(lote-lot*losses/DecreaseFactor,1);

}

//---- tamanho do lote de retorno

if(lote<0,1) lote=0,1;

retorno(lote);

}

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

Você recebe algum código de erro ou alguma outra coisa (em testes anteriores) que lhe dá uma dica do que está dando errado?

panteraschoice:
#link da propriedade "https://www.forex-tsd.com"

número de MagicNumber int externo = 1001;

external bool EachTickMode = False;

extern double Lots = 0,01;

extern int Slippage = 4;

bool StopLossMode externo = Verdadeiro;

StopLoss int externo = 70;

bool TakeProfitMode externo = Verdadeiro;

extern int TakeProfit = 300;

bool TrailingStopMode = Verdadeiro; bool StopLossMode = Verdadeiro;

Exterior int TrailingStop = 25;

extern double MaximumRisk =0;//0.15

duplo DiminuiçãoFator externo =3;

Exterior int MaxOrders = 3000;

externo bool UseHourTrade = Falso;

extern int FromHourTrade = 8;

externo int ToHourTrade = 18;

#define SIGNAL_NONE 0

#define SIGNAL_BUY 1

#define SIGNAL_SELL 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

no BarCount;

int Corrente;

bool TickCheck = Falso;

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

//| função de iniciação de especialista |

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

int init() {

BarCount = Barras;

se (CadaTickMode) Corrente = 0; caso contrário Corrente = 1;

retorno(0);

}

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

//| função de desinicialização especializada |

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

int deinit() {

retorno(0);

}

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

//| função de início especializado |

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

int start() {

se (UseHourTrade){

if (!(Hour()>=FromHourTrade && Hour()<=ToHourTrade)) {

Comentário ("Não chegou a hora do comércio!");

retorno(0);

}

}

int Ordem = SIGNAL_NONE;

int Total, Bilhete;

nível duplo StopLossLevel, TakeProfitLevel;

int digit = MarketInfo(Symbol(),MODE_DIGITS);

if (CadaTickMode && Bars != BarCount) CadaTickMode = Falso;

Total = OrdensTotal();

Order = SIGNAL_NONE;

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

//| Início do sinal |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

duplo Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Ordem = SINAL_BUY;

if (sig_sell>0 && Sg<0 ) Ordem = SINAL_SELL;

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

//| Fim do sinal |

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

//Compra

if (Order === SIGNAL_BUY && ((EachTickMode && !TickCheck) ||| (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Cheque margem livre

if (AccountFreeMargin() < (1000 * Lotes)) {

Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin());

devolução(0);

}

StopLossLevel = Perguntar - StopLoss * Ponto;

TakeProfitLevel = Ask + TakeProfit * Ponto;

Ticket = OrderSend(Symbol(), OP_BUY, LotsOptimized(),

NormalizeDuplo(Pergunte,dígito),

Slippage,

NormalizeDuplo(StopLossLevel,digit),

NormalizeDuplo(TakeProfitLevel,digit),

"Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if(Ticket > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Imprimir("ordem de compra aberta : ", OrderOpenPrice()); ou Imprimir("erro de abertura da ordem de compra: ", GetLastError()));

}

se (EachTickMode) TickCheck = Verdadeiro;

se (!EachTickMode) BarCount = Bars;

return(0);

}

}

//vender

if (Order === SIGNAL_SELL && ((EachTickMode && !TickCheck) ||| (!EachTickMode && (Bars != BarCount)))) {

if(ScanTrades() < MaxOrders) {

//Cheque margem livre

if (AccountFreeMargin() < (1000 * Lotes)) {

Imprimir("Nós não temos dinheiro. Margem Livre = ", AccountFreeMargin());

devolução(0);

}

StopLossLevel = Bid + StopLoss * Ponto;

TakeProfitLevel = Bid - TakeProfit * Ponto;

Ticket = OrderSend(Symbol(), OP_SELL, LotsOptimized(),

NormalizeDuplo(Bid,digit),

Slippage,

NormalizeDuplo(StopLossLevel,digit),

NormalizeDuplo(TakeProfitLevel,digit),

"Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if(Ticket > 0) {

se (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) Imprimir("Pedido de VENDA aberto : ", OrderOpenPrice()); ou Imprimir("Erro na abertura do pedido de VENDA : ", GetLastError()));

}

se (EachTickMode) TickCheck = Verdadeiro;

se (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Cheque posição

para (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

if(OrderType() == OP_BUY && OrderMagicNumber()==MagicNumber ) {

//Close

if (Order === SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

se (EachTickMode) TickCheck = Verdadeiro;

if (!EachTickMode) BarCount = Bars;

return(0);

}

// Parada de trilha

if(TrailingStopMode && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Ponto * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

se (!EachTickMode) BarCount = Bars;

retorno(0);

}

}

}

{} else {

if(OrderType()==OP_SELLL && OrderMagicNumber()==MagicNumber)

{

//Close

if (Order === SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount))))

{

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

se (EachTickMode) TickCheck = Verdadeiro;

if (!EachTickMode) BarCount = Bars;

return(0);

}

// Parada de trilha

se (TrailingStopMode && TrailingStop > 0)

{

if((OrderOpenPrice() - Ask) > (Ponto * TrailingStop)) {

if((OrderStopLoss() > (Pergunte + Ponto * TrailingStop)) ||| (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

se (!EachTickMode) BarCount = Bars;

retorno(0);

}

}

}

}}

}

}

se (!EachTickMode) BarCount = Bars;

retorno(0);

}

int ScanTrades()

{

int total = EncomendasTotal();

int numords = 0;

for(int cnt=0; cnt<total; cnt++)

{

OrderSelect(cnt, SELECT_BY_POS);

if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == MagicNumber)

numords++;

}

retorno(numords);

}

//bool ExistPosições() {

// para (int i=0; i<OrdersTotal(); i++) {

// se (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {/ if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

// if (OrderSymbol()==Symbol() && OrderMagicNumber()==MagicNumber) {

// retorno(Verdadeiro);

// }

// }

// }

// retorno(falso);

//}

duplo LotsOptimized()

{

lote duplo=Lotes;

int orders=HistoryTotal(); // histórico total de ordens

int losses=0; // número de ordens de perdas sem intervalo

//---- selecione o tamanho do lote

if(MaximumRisk>0)lot=NormalizeDouble(Lots*AccountFreeMargin()*MaximumRisk/1000.0,1);

//---- calcule o número de ordens de perdas sem uma pausa

if(DiminaseFactor>0)

{

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

{

if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==falso) { Print("Erro na história!"); break; }

if(OrderSymbol()!=Symbol() || OrderType()>OP_SELLL) continua;

//----

if(OrderProfit()>0) quebra;

if(OrderProfit()<0) perdas++;

}

if(perdas>1) lote=NormalizarDuplo(lote-lot*losses/DecreaseFactor,1);

}

//---- tamanho do lote de retorno

if(lote<0,1) lote=0,1;

retorno(lote);

}

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

Estou fazendo um backtest agora apenas com o RSIFilter, uso o RSIMixFilter alguns posts atrás neste tópico, publiquei esse indicador, e recebo BUYS e SELLS, então a lógica para fazer as ordens COMPRAR e VENDER estão bem, a questão é com seus sinais iCustom...

RSIMixFilter, não está neste tópico, desculpe, está aqui ASK

panteraschoice:
criando uma ea lucrativa, mas poderia ser duas vezes melhor (talvez) por enquanto só são feitas compras, nunca vendas de encomendas.

Alguém sabe por quê?

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

//| Início do sinal |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

duplo Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Ordem = SINAL_BUY;

if (sig_sell>0 && Sg<0 ) Ordem = SINAL_SELL;

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

//| Fim do sinal |

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

Fiz alguns testes, EURUSD H1 desde abril de 2007 até agora, apenas com este RSIMixFilter...

Tem que ser 90% de qualidade de modelagem, não sei porque não aparece.

panteraschoice:
criando uma ea lucrativa, mas poderia ser duas vezes melhor (talvez) por enquanto só são feitas compras, nunca vendas de encomendas.

Alguém sabe por quê?

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

//| Início do sinal |

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

double sig_buy = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 0, 0, 0);

double sig_sell = iCustom(NULL, 0, "Slope Direction Line",40, 2, 0, 1, 0);

duplo Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se (sig_buy>0 && Sg>0) Ordem = SINAL_BUY;

if (sig_sell>0 && Sg<0 ) Ordem = SINAL_SELL;

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

//| Fim do sinal |

//+------------------------------------------------------------------+
Arquivos anexados:

Este backtesting, ele deu compras e vendas ou apenas uma delas? Comigo só consegui comprar (ou só vender quando mudei o código).

Eu realmente não vi nada que mostrasse um erro.

IN10TION:
Estou fazendo um backtest agora apenas com o RSIFilter, uso o RSIMixFilter há poucos posts neste tópico, publiquei esse indicador, e recebo BUYS e SELLS, então a lógica para fazer as ordens COMPRAR e VENDER está bem, a questão é com seus sinais iCustom...

Então isto está bem?

duplo Sg=iCustom(NULL,0, "RSIFilter_v1",5,5,0,1);

se ( Sg>0) Ordem = SIGNAL_BUY;

se ( Sg<0 ) Ordem = SIGNAL_SELL;