Como codificar? - página 100

 

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;

Razão: