Como codificar? - página 151

 
luxinterior:
Use a função OrderReliable incluir file.Lux

parece estar um pouco ausente para a função OrderSendReliable... você tem uma versão posterior?

 

Como usar o tempo nos cálculos

Sou novo na MQL4 e estava apenas tentando ver se eu poderia fazer uma simples EA que usasse algumas funções básicas. Conheço bem C++, mas devo ser horrível na MQL4, porque algo está acontecendo com este código e acho que tem a ver com as funções de tempo ou, possivelmente, as funções de compra/venda, aqui está o código: ...e, a propósito, isto não foi projetado para ganhar dinheiro, apenas teste as funções Obrigado!

int start()

{

//----

tempoN de corrente dupla, valor atual;

duplo timeM = TimeMinute (TimeCurrent());

duplo timeH = TimeHour(TimeCurrent());

currenttimeN = (timeH / 24) + (timeM / 1440);//g dá a hora do dia como porcentagem ou 1 (1 = um dia completo) então sempre menos de 1

valor atual = Perguntar;

se (valor atual > tempo atualN){

OrderSend(Symbol(),OP_SELL,1,Ask,3,Ask-25*Point,Ask+25*Point, "My order #2",16384,0,Green);

}

/* COMANDO DE COMPRA */

senão se (valor atual < tempo atualN){

OrderSend(Symbol(),OP_BUY,1,Ask,3,Ask-25*Point,Ask+25*Point, "My order #2",16384,0,Green);

}

//----

retorno(0);

}

 

...................

 

Cordel errado:

currenttimeN = (timeH / 24) + (timeM / 1440);//gives the time of day as a percent or 1 (1 = one complete day) so always less than 1[/CODE]

could be:

[CODE]currenttimeN = (timeH *60 + timeM) / 1440;

Como você pode comparar parte do dia com o preço?

 

comprar e vender ao mesmo tempo

alguém pode ajudar a programar para que eu possa comprar e vender ao mesmo tempo...alguns scripts ou etc...

eu agradeço...

exemplo:

se (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point,"-", 0, 0, Vermelho);

}

o problema é que só vai comprar...mas não vai executar os dois pedidos...obrigado...

 
kk81:
alguém pode ajudar a programar para que eu possa comprar e vender ao mesmo tempo...alguns scripts ou etc...

eu agradeço...

exemplo:

se (Stoch1>=Stoch2)

{

ticket=OrderSend(Symbol(), OP_BUY, Lots, Ask, 3, Ask-Stoploss*Point, Ask+TakeProfit*Point, "-", 0, 0, Green);

ticket=OrderSend(Symbol(), OP_SELL, Lots, Bid, 3, Ask-Stoploss*Point, Bid-TakeProfit*Point, "-", 0, 0, Vermelho);

}

o problema é que só vai comprar...mas não vai executar os dois pedidos...obrigado...

https://www.mql5.com/en/forum/177583/page37

 

como obter pedidoFechar preço de retorno ?

Quero saber, a que preço o pedido é fechado

Arquivos anexados:
closeorder.jpg  62 kb
 

Barra de liberdade Forex

oi

muito obrigado a todos os amigos , específico Roger09

Eu quero expert (comércio automático) ForexFreedomBars .

quando quadrado 5m , 15m ,30m ,1H é Vermelho , enviar ordem de venda por 10-20 TP

quando quadrado 5m , 15m ,30m ,1H é Azul , enviar pedido COMPRAR por 10-20 TP

(TP, SL , lote, maxtrade) a capacidade de mudar

por favor, me ajude .

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

//| #As Barras de Liberdade Forex

//|

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

#property copyright "Programmed by Eli hayun" (Programado por Eli hayun)

#janela_indicadora de propriedade_separarate_window

# indicador de propriedade_mínimo -0,5

//# indicador de propriedade_máximo 5

#property indicator_buffers 8

#indicador de propriedade_cores1 Vermelho

#indicador de propriedade_color2 DodgerBlue

#indicador de propriedade_cores3 Vermelho

#indicador de propriedade_color4 DodgerBlue

#indicador de propriedade_color5 Vermelho

#Indicador de propriedade_color6 DodgerBlue

#Indicador de propriedade_cores7 Vermelho

#Indicador de propriedade_color8 DodgerBlue

//---- buffers

duplo buf4_up[];

double buf4_down[];

duplo buf3_up[];

duplo buf3_baixo[];

duplo buf2_up[];

duplo buf2_baixo[];

duplo buf1_up[];

duplo buf1_baixo[];

double Gap externo = 1; // Gap entre as linhas das barras

período de int. externo_1 = PERÍODO_M5;//M15

período de int. externo_2 = PERÍODO_M15;//M30

externo int Período_3 = PERÍODO_M30;//H1

extern int Período_4 = PERÍODO_H1;//H4

int cci_1 = 2;//50

int cci_2 = 2;//14

int cci_3 externo = 2;

int cci_4 = 2;

externo int StopLoss=100;

extern int TakeProfit=100;

extern double Lots=0,1;

extern bool AutoDisplay = falso;

curto-circuito de corda = "";

bool firstTime = true;

int UniqueNum = 228;

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

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

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

int init()

{

SetAutoDisplay();

shortname = "# Liberdade Forex("+Periodo_1+", "+Periodo_2+", "+Periodo_3+", "+Periodo_4+")";

firstTime = verdadeiro;

IndicatorShortName(nome curto);

//---- indicadores

SetIndexStyle(0,DRAW_ARROW);

SetIndexArrow(0,110);

SetIndexBuffer(0,buf4_up);

SetIndexEmptyValue(0,0,0.0);

SetIndexStyle(1,DRAW_ARROW);

SetIndexArrow(1,110);

SetIndexBuffer(1,buf4_down);

SetIndexEmptyValue(1,0.0);

SetIndexStyle(2,DRAW_ARROW);

SetIndexArrow(2,110);

SetIndexBuffer(2,buf3_up);

SetIndexEmptyValue(2,0.0);

SetIndexStyle(3,DRAW_ARROW);

SetIndexArrow(3,110);

SetIndexBuffer(3,buf3_down);

SetIndexEmptyValue(3,0.0);

SetIndexStyle(4,DRAW_ARROW);

SetIndexArrow(4,110);

SetIndexBuffer(4,buf2_up);

SetIndexEmptyValue(4,0.0);

SetIndexStyle(5,DRAW_ARROW);

SetIndexArrow(5,110);

SetIndexBuffer(5,buf2_down);

SetIndexEmptyValue(5,0,0.0);

SetIndexStyle(6,DRAW_ARROW);

SetIndexArrow(6,110);

SetIndexBuffer(6,buf1_up);

SetIndexEmptyValue(6,0,0.0);

SetIndexStyle(7,DRAW_ARROW);

SetIndexArrow(7,110);

SetIndexBuffer(7,buf1_down);

SetIndexEmptyValue(7,0.0);

//----

retorno(0);

}

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

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

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

int deinit()

{

//----

SetAutoDisplay();

shortname = "# Liberdade Forex("+Periodo_1+", "+Periodo_2+", "+Periodo_3+", "+Periodo_4+")";

firstTime = verdadeiro;

//----

retorno(0);

}

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

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

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

int start()

{

int counted_bars=IndicatorCounted();

int i=0, y5m=0, y1h=0, y30m=0, y15m=0, yy;

int limit=Barras_contadas_combars;

datetime TimeArray_1H[], TimeArray_30M[], TimeArray_15M[], TimeArray_5M[];

//----

se (firstTime || NewBar())

{

firstTime = falso;

int win = UniqueNum; // WindowFind(shortname);

double dif = Tempo[0] - Tempo[1];

for (int ii=ObjectsTotal()-1; ii>-1; ii--)

{

if (StringFind(ObjectName(ii), "FF_"+win+"_") >= 0)

ObjectDelete(ObjectName(ii)));

senão

ii=-1;

}

turno duplo = 0,2;

para (ii=0; ii<4; ii++)

{

string txt = "??";

gp duplo;

interruptor (ii)

{

caso 0: txt = tf2txt(Período_1); gp = 1 + turno; intervalo;

caso 1: txt = tf2txt(Período_2); gp = 1 + Diferença + turno; pausa;

caso 2: txt = tf2txt(Período_3); gp = 1 + Gap*2 + turno; pausa;

caso 3: txt = tf2txt(Período_4); gp = 1 + Gap*3 + turno; pausa;

}

nome da cadeia = "FF_"+win+"_"+ii+"_"_"+txt;

ObjectCreate(name, OBJ_TEXT, WindowFind(shortname), iTime(NULL,0,0)+dif*3, gp);

ObjectSetText(name, txt,8, "Arial", Silver);

}

}

ArrayCopySeries(TimeArray_1H,MODE_TIME,Symbol(),Period_4);

ArrayCopySeries(TimeArray_30M,MODE_TIME,Symbol(),Period_3);

ArrayCopySeries(TimeArray_15M,MODE_TIME,Symbol(),Period_2);

ArrayCopySeries(TimeArray_5M,MODE_TIME,Symbol(),Period_1);

for(i=0, y5m=0, y1h=0, y30m=0, y15m=0;i<limite;i++)

{

se (Tempo<TimeArray_5M[y5m]) y5m++;

if (Tempo<TimeArray_1H[y1h]) y1h+++;

if (Tempo<TimeArray_30M[y30m]) y30m+++;

if (Tempo<TimeArray_15M[y15m]) y15m++;

int cci_n = cci_1;

for (int tf = 0; tf < 4; tf+++)

{

int prd;

interruptor (tf)

{

caso 0: prd = Período_1; cci_n = cci_1; yy = y5m; intervalo;

caso 1: prd = Período_2; cci_n = cci_2; yy = y15m; pausa;

caso 2: prd = period_3; cci_n = cci_3; yy = y30m; pausa;

caso 3: prd = period_4; cci_n = cci_4; yy = y1h; pausa;

}

duplo cci = iCCI(NULL, prd, cci_n,PRICE_TYPICAL, yy);

duplo dUp = EMPTY_VALUE; // iCustom(NULL, prd, "SuperTrend", false, 1, yy);

duplo dDn = EMPTY_VALUE; //iCustom(NULL, prd, "SuperTrend", falso, 0, yy);

se (cci < 0) dUp = 1; caso contrário dDn = 1;

switch (tf)

{

caso 0: se (dUp == EMPTY_VALUE) buf1_down = 1; caso contrário buf1_up = 1; break;

caso 1: if (dUp == EMPTY_VALUE) buf2_down = 1 + Gap * 1; caso contrário buf2_up = 1 + Gap * 1; pausa;

caso 2: if (dUp == EMPTY_VALUE) buf3_down = 1 + Gap * 2; caso contrário buf3_up = 1 + Gap * 2; pausa;

caso 3: if (dUp == EMPTY_VALUE) buf4_down = 1 + Gap * 3; caso contrário buf4_up = 1 + Gap * 3; pausa;

}

se (NewBar())

{

string sDir = "";

if (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

sDir = "Para cima";

se (buf1_baixo[0] + buf2_baixo[0] + buf3_baixo[0] + buf4_baixo[0] == 4)

sDir = "Para baixo";

se (sDir != "")

{

PlaySound("alert1.wav");

Print("Forex freeway - Direção ",sDir);

}

}

}

}

se (buf1_up[0] + buf2_up[0] + buf3_up[0] + buf4_up[0] == 4)

OrderSend(Symbol(),OP_BUY,Lots,Ask,3,StopLoss,TakeProfit); else

retorno(0);

}

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

string tf2txt(int tf)

{

se (tf == PERÍODO_M1) retornar("M1");

se (tf == PERÍODO_M5) retorno("M5");

if (tf == PERÍODO_M15) return("M15");

if (tf == PERÍODO_M30) return("M30");

if (tf == PERÍODO_H1) return("H1");

if (tf == PERÍODO_H4) return("H4");

if (tf == PERÍODO_D1) return("D1");

if (tf == PERÍODO_W1) return("W1");

if (tf == PERÍODO_MN1) return("MN1");

return("??");

}

SetValues (int p1, int p2, int p3, int p4)

{

Período_1 = p1; Período_2 = p2; Período_3 = p3; Período_4 = p4;

}

SetAutoDisplay() vazio

{

se (AutoDisplay)

{

interruptor (Período())

{

caso PERÍODO_M1 : SetValues(PERÍODO_M1, PERÍODO_M5, PERÍODO_M15,PERÍODO_M30); pausa;

caixa PERIOD_M5 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); pausa;

caixa PERIOD_M15 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30,PERIOD_H1); pausa;

caixa PERIOD_M30 : SetValues(PERIOD_M5, PERIOD_M15,PERIOD_M30, PERIOD_H1); pausa;

caixa PERIOD_H1 : SetValues(PERIOD_M15, PERIOD_M30,PERIOD_H1, PERIOD_H1, PERIOD_H4); pausa;

caixa PERIOD_H4 : SetValues(PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1); pausa;

caixa PERIOD_D1 : SetValues(PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1); pausa;

caixa PERIOD_W1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); pausa;

caixa PERIOD_MN1 : SetValues(PERIOD_H4, PERIOD_D1, PERIOD_W1,PERIOD_MN1); pausa;

}

}

}

bool NewBar()

{

data/hora estática dt = 0;

se (Hora[0] != dt)

{

dt = Tempo[0];

return(true);

}

retorno(falso);

}

 

Indicador de migração de problemas para EA como uma função de filtro

Ao tentar usar parte de um indicador como uma função em minha EA, agora percebo que existem três tipos de funções. O primeiro tipo é um Void que realiza um processo e retorna 0. O segundo tipo realiza cálculos e retorna um resultado. O terceiro tipo espera receber um conjunto de valores específicos para processar e depois retorna um resultado.

O que posso fazer se meus cálculos produzirem três resultados que precisam ser usados de pelo menos duas maneiras diferentes? Esses cálculos podem precisar ser localizados na função Start() pelo seguinte motivo: fluxos de informação das variáveis Externas (que podem ser ajustadas manualmente) e das variáveis Globais (que permanecem estáticas a menos que recompiladas) para as diversas funções do EA. A função Start() é o cérebro do EA e alcança as outras funções para sua informação. Ela pode passar um conjunto de variáveis para uma função como argumentos dessa função, se essa função tiver declarado essas variáveis dentro de seus parênteses (). Ela então recebe um resultado de volta e pode passar mais variáveis para outra função para finalizar o seu processo.

Uma vez que eu tenha ensacado variáveis como argumentos para outras funções, eu esperava desfrutar de um nível de sucesso com minha codificação EA. Infelizmente, criei um erro de divisão zero, possivelmente porque tentei passar um valor como argumento de uma função para outra, para que o valor não chegasse. Como na verdade estava faltando, eu recebi o erro de divisão zero. Minha próxima revisão removeu os passos intermediários e entregou valores diretamente às funções onde eles foram utilizados.

(Não faço nenhum favor a mim mesmo ao registrar este ponto em meus dois primeiros meses de experiência aprendendo a codificação MQL4. Entretanto, qualquer um que possa estar procurando no Google "MQL4 zero erro de divisão", pode ficar feliz em saber como eu consegui resolvê-lo).

Minha próxima revisão EA curou meu erro de divisão zero, mas o comentário do diário de meu testador de estratos agora indicava um excesso de pilha. Para aqueles que pesquisam no Google "MQL4 overrun stack overrun", postarei a causa que encontrei. Foi falha na conversão de lotes para seu equalizador decimal pelo uso da constante "Pontos" ao alterar um preço de abertura ou modificação de um pedido.

A última dica que gostaria de publicar aqui (após meus dois meses iniciais de experiência em codificação e mais de 12 reescritas EA) é uma maneira que consegui resolver um parênteses "desigual à esquerda" difícil de encontrar. O MetaEditor não destaca o texto do colchete em cores. Se você tiver um produto AutoDesk com Visual LISP Editor, você pode abrir seu arquivo MQ4 nesse editor e ver quase todos os pares de parênteses em cores. Isto facilita muito a leitura da prova para o parêntese que falta.

Obrigado a todos que compartilham suas respostas neste fórum,

Feliz Codificação!

 

Alguma ajuda?

Também gostaria de saber se as ordens Metatrader podem ser executadas a partir da linha de comando. Ou em geral se é possível fazer a interface de aplicações externas com o Metatrader usando algum tipo de API.

Obrigado

Jeff