Pergunte! - página 88

 
 

graças a Ralph, tentei isso, mas depois deu outra lista de erros - disse que todas as variáveis do arquivo de inclusão não estão definidas - mas elas são

Terei outra oportunidade durante o fim de semana, isso está me frustrando um pouco no momento.

@faqcya - Suspeito que você esteja certo em colocá-lo em um roteiro, mas não sei como lidar com isso, a menos que eu tenha uma EA de concha para colocá-lo.

Talvez eu dê uma olhada nos modelos e veja se posso chamá-lo a partir disso ou, melhor ainda, se posso transformá-lo em um EA, eu só quero que seja como é, não fazer mais nada.

Obrigado por sua ajuda,

Kevin

ralph.ronnquist:
@pgtips: mudar a segunda linha para ser apenas
#define MAGIC 20051120
ou seja, sem sinal de igualdade e sem vírgula.
 

Tentando aprender programação

Antes de mais nada, li todo o curso por Corder's Guru e achei muito interessante. Cheguei à conclusão de que a única maneira razoável de experimentar uma estratégia é escrevendo um programa para garantir que ele seja totalmente preciso. Infelizmente, eu sou um novato total quando se trata disso.

Tenho tentado escrever um programa básico e não consigo nem mesmo fazer com que isso funcione. Pelo menos não recebo mais erros, mas ele não aceita ordens. Sou persistente e continuarei tentando, mas agradeceria alguma ajuda de qualquer um que veja meu erro.

Tudo o que estou tentando fazer neste momento é rastrear o preço mais baixo (CurrentLow) e depois, quando ele voltar por uma certa quantidade (Ret1), colocar um pedido de venda com TP do ponto baixo.

Por favor, não ria, mas o seguinte é o que tenho escrito até agora:

//---- parâmetros de entrada

duplo TP1 externo=75,0;

duplo externo Ret1=75.0;

duplo externo SL1=150.0;

duplo externo Lots=0,1;

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

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

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

int init()

{

//----

//----

retorno(0);

}

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

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

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

int deinit()

{

//----

//----

retorno(0);

}

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

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

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

int start()

{

int ticket=0;

if(Bars<100)

{

Impressão ("barras com menos de 100");

retornar(0);

}

Corrente duplaBaixa,CorrenteAlta;

if(Bid < CorrenteBaixa)

{

CurrentLow = Bid;

if(Bid > CurrentHigh)

{

AtualAlto = Licitação;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

retornar (0);

}

retorno (0);

}

retorno(0);

}

}

 
Putz:
Antes de mais nada, li todo o curso por Corder's Guru e achei muito interessante. Cheguei à conclusão de que a única maneira razoável de experimentar uma estratégia é escrevendo um programa para garantir que ele seja totalmente preciso. Infelizmente, eu sou um novato total quando se trata disso.

Eu tenho tentado escrever um programa básico e não consigo nem mesmo fazer isso funcionar. Pelo menos não recebo mais erros, mas ele não aceita ordens. Sou persistente e continuarei tentando, mas apreciaria a ajuda de qualquer um que veja meu erro.

Tudo o que estou tentando fazer neste ponto é rastrear o preço mais baixo (CurrentLow) e então, quando ele se retrai em uma certa quantidade (Ret1), colocar um pedido de venda com TP do ponto baixo.

Por favor, não ria, mas o seguinte é o que tenho escrito até agora:

//---- parâmetros de entrada

duplo TP1 externo=75,0;

duplo externo Ret1=75.0;

duplo externo SL1=150.0;

duplo externo Lots=0,1;

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

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

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

int init()

{

//----

//----

retorno(0);

}

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

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

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

int deinit()

{

//----

//----

retorno(0);

}

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

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

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

int start()

{

int ticket=0;

if(Bars<100)

{

Impressão ("barras com menos de 100");

retornar(0);

}

Corrente duplaBaixa,CorrenteAlta;

if(Bid < CorrenteBaixa)

{

CurrentLow = Bid;

if(Bid > CurrentHigh)

{

AtualAlto = Licitação;

if(CurrentHigh >= CurrentLow+(Point*Ret1))

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",757575,0,Green);

retornar (0);

}

retorno (0);

}

retorno(0);

}

}

Parece errado verificar se Bid > CurrentHigh dentro da verdadeira condição que Bid < CurrentLow; eu acho que você deveria ter testes independentes como este :

double CurrentLow,CurrentHigh;

int start()

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid > CurrentHigh) CurrentHigh = Bid;

if(Bid >= CurrentLow+(Point*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point),"Albatross_v1",757575,0,Green);

return(0);

}

Agora, três observações:

- Você tem que declarar CurrentHigh e CurrentLow em um furo global, ou seja, fora de qualquer função (e start() é uma função) de outro tamanho, essas variáveis serão inicializadas a 0 a cada chamada da função.

- Você não precisa de CurrentHigh porque não é usado.

- Você tem que implementar alguma lógica para redefinir/atualizar o valor de CurrentLow, e provavelmente limitar a abertura das ordens a cada tick acima de CurrentLow+(Ponto*Ret1))

 

Olá, Michel,

Muito obrigado por sua pronta resposta e ajuda.

Eu apaguei o CurrentHigh e agora entendo muito melhor. Eu também defini CurrentLow no topo do programa e agora ele realmente faz pedidos.

Também acrescentei um segundo pedido baseado em um retracement maior e isso parece funcionar. Agora tenho que descobrir como impedi-lo de criar um novo pedido a cada tic tac, mas trabalharei nisso sozinho por enquanto, pois aprenderei melhor dessa forma.

Tenho certeza que estarei de volta aqui com mais perguntas.

Mais uma vez, obrigado.

Putz

 
Putz:
Olá, Michel,

Muito obrigado por sua pronta resposta e ajuda.

Eu apaguei o CurrentHigh e agora entendo muito melhor. Eu também defini CurrentLow no topo do programa e agora ele realmente faz pedidos.

Também acrescentei um segundo pedido baseado em um retracement maior e isso parece funcionar. Agora tenho que descobrir como impedi-lo de criar um novo pedido a cada tic tac, mas trabalharei nisso sozinho por enquanto, pois aprenderei melhor dessa forma.

Tenho certeza que estarei de volta aqui com mais perguntas.

Mais uma vez, obrigado.

Putz

Não esqueça de inicializar o CurrentLow com um grande valor (como 1000); se ele for inicializado com 0, você nunca terá um Bid < 0

 

Qual luguagem de programação devo aprender?

codersguru:
Oi pessoal,

Tenho muitas mensagens particulares me pedindo ajuda com alguns trechos de código.

Aqui você pode postar suas perguntas relacionadas à MQL4, e eu farei o meu melhor para respondê-las.

Caros codificadoresguru,

Se eu quiser aprender a escrever códigos MQL4, que linguagem de programação devo aprender? Visual básico ou C++? Obrigado por sua resposta.

 

Mais ajuda, por favor.

Olá,

Estou de volta para mais ajuda. Estive lendo e olhando para muitas outras EA's para tentar descobrir, mas ainda não consegui fazer com que funcionasse corretamente.

O que eu estou tentando fazer é fazer duas encomendas.

1) Vender 0,1 lote uma vez que o preço retrai por Ret1 (75 pips) com TP1 (75) e SL1 (150)

2) Vender 0,2 lote uma vez que o preço retrai por Ret2 (150 pips) com TP1 (75) e SL1 (75)

A longo prazo, quero que uma ordem de compra como a acima seja colocada com base na direção da tendência. Ainda não determinei qual indicador usarei para determinar a tendência ainda, mas chegarei lá em algum momento.

O seguinte é o que eu tenho atualmente. Parece colocar a primeira ordem de compra corretamente, mas a segunda nunca é acionada. Qualquer ajuda será muito apreciada.

String externo Expert_Name = "Albatross v1";

Externo int MagicNumber = 757575;

Externo int Slippage = 3,0;

//---- parâmetros de entrada

duplo TP1 externo=75,0;

duplo TP2 externo=75,0;

duplo externo Ret1=75.0;

duplo Ret2=150.0; duplo Ret2=150.0;

duplo SL1=150.0; duplo SL1=150.0; duplo SL1=75.0; duplo SL1=75.0;

duplo SL2=75.0; duplo SL2=75.0;

duplo externo Lots=0,1;

duplo de CorrenteBaixa=1000;

//dupla CorrenteAlta=0;

int OpenOrders=0,cnt=0;

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

//| Função de inicialização do indicador personalizado |

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

//int init()

// {

//---- indicadores

//----

// retorno(0);

// }

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

//| Função de desinicialização de indicador personalizada |

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

// int deinit()

// {

//---- TODO: adicione seu código aqui

//----

// retorno(0);

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

//| Função de iteração de indicador personalizada |

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

// int start()

// {

//---- TODO: adicione seu código aqui

//----

// retorno(0);

// }

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

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

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

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

int init()

{

//----

//----

retorno(0);

}

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

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

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

int deinit()

{

//----

//----

retorno(0);

}

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

//| Verificar controles de posição aberta |

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

int CheckOpenTrades()

{

int cnt;

int NumTrades; // Número de operações de compra e venda neste símbolo

NumTrades = 0;

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

{

OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);

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

se ( OrderMagicNumber() != MagicNumber) continuar;

if(OrderType() == OP_BUY ) NumTrades++;

if(OrderType() == OP_SELL ) NumTrades++;

}

retorno (NumTrades);

}

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

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

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

int start()

{

int cnt, bilhete, total;

duplo TP;

if(Bars<100)

{

Impressão ("barras com menos de 100");

retornar(0);

}

total = CheckOpenTrades();

if(total < 1)

{

if(Bid < CurrentLow) CurrentLow = Bid;

if(Bid >= CorrenteBaixa+(Ponto*Ret1))

OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+(SL1*Point),Bid-(TP1*Point), "Albatross_v1",MagicNumber,0,Green);

}

if(total < 2)

{

if(Bid >= CorrenteBaixa+(Ponto*Ret2))

OrderSend(Symbol(),OP_SELL,Lots*2,Bid+(Point*Ret2),3,Bid+(SL2*Point),Bid-(TP2*Point), "Albatross_v1",MagicNumber,0,Green);

return(0);

}

}

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

 

Desculpe incomodá-lo com esta pergunta

Como se cria um objeto que é preenchido com uma cor?

Dave ...

<<<

 

Olá a todos, eu sou um codificador e estou codificando há muito tempo em C++, mas meu conhecimento de FX e MQL4 é muito básico. Eu vou espalhar um EA que alguém escreveu e tentar entender o código.

você pode me explicar em inglês simples que o que é parâmetro SHIFT no método iMA?

duplo iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

de acordo com a ajuda do MT4, seu "Índice do valor retirado do buffer de indicadores (deslocamento em relação à barra atual a quantidade dada de períodos atrás)". - o que é buffer de indicador???

ele também está fazendo o seguinte...

int RealTime = 0;

if( UseCompletedBars )

{

if(timeprev==Time[0]){return(0);} timeprev = Time[0];

RealTime = 1;

}

double MA11 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,0+RealTime);

double MA12 = iMA(NULL,0,MA1Periods,0,MA1MethodSelected, MA1ArraySelected,1+RealTime);

double MA21 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,0+RealTime);

double MA22 = iMA(NULL,0,MA2Periods,0,MA2MethodSelected, MA2ArraySelected,1+RealTime);

if( MA11 > MA21 && MA12 < MA22 ) { EnterLong = True; }

if( MA11 MA22 ) { EnterShort = True; }

o que isso retornaria? já que eu não conheço o deslocamento, acho que é por isso que não posso obtê-lo ...

sua resposta será muito bem recebida.

por favor, ajude.