Como codificar? - página 135

 

Erro por erro de compilação

Olá a todos

Eu tenho o seguinte erro:

<'-diferentes tipos em comparação

Eu tento modificar a linha:

(NonLagMA_2D_S2&&D_S2Switch==1)

para

(Price_NowD_S2&&D_S2Switch==1)

Onde está o problema?

Desculpe, não é possível carregar o arquivo mql-. Não é o meu script.

 
:: você compara algo com tipos diferentes, então tem que ser inteiros com inteiros, duplas com duplas, cordas com cordas... assim...

IN10ÇÃO

Badguy:
Olá a todos

Eu tenho o seguinte erro:

<'-diferentes tipos em comparação

Eu tento modificar a linha:

(NonLagMA_2D_S2&&D_S2Switch==1)

para

(Price_NowD_S2&&D_S2Switch==1)

Onde está o problema?

Desculpe não poder carregar o arquivo mql-. Não é o meu script
 

Fechando posições múltiplas por número mágico - Ajuda

Olá a todos.

Eu sou novo na programação do mt4 e abaixo estão minhas primeiras EA. O objetivo deste EA é fechar todas as posições independentemente de qualquer par de moedas com base no mesmo número mágico.

Digamos que sob o número mágico 8675310, eu tenho 2 posições EURUSD & USDCFh. Ela será capaz de fechar todos esses pares quando atingir determinada meta de lucro.

O problema com este EA é,

Transação aberta nº 1 EURUSD (capaz de fechar)

Transação aberta nº 2 USDCFh (não poderá fechar)

NÃO SERÁ CAPAZ DE FECHAR A TRANSAÇÃO Nº 2.

Alguma idéia ?

Obrigado

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

//| Encerramento_Comércio_Por_Magic_No_v1 .mq4 |

//| Mina |

//| Software de Comércio Forex: Plataforma de negociação Forex MetaTrader 4 |

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

#propriedade copyright "Mine" (Meu)

#link da propriedade "http://www.metaquotes.net"

//---- parâmetros de entrada

externo int MagicNumber1=8675310;

extern int Profit1=10;

externo int MagicNumber2=8675311;

extern int Lucro2=15;

externo int MagicNumber3=8675312;

extern int Lucro3=15;

externo int MagicNumber4=8675313;

extern int Lucro4=15;

externo int MagicNumber5=8675314;

extern int Lucro5=15;

externo int MagicNumber6=0;

extern int Lucro6=10;

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

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

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

int init()

{

onScreenComment(98, "Tengak Initialize...");

//----

//----

retorno(0);

}

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

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

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

int deinit()

{

//----

//----

retorno(0);

}

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

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

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

int start()

{

string myMessage="";

myMessage = myMessage + ProfitLossMonitor(1,MagicNumber1,Pr ofit1,myMessage);

myMessage = myMessage + ProfitLossMonitor(2,MagicNumber2,Pr ofit2,myMessage);

myMessage = myMessage + ProfitLossMonitor(3,MagicNumber3,Pr ofit3,myMessage);

myMessage = myMessage + ProfitLossMonitor(4,MagicNumber4,Pr ofit4,myMessage);

myMessage = myMessage + ProfitLossMonitor(5,MagicNumber5,Pr ofit5,myMessage);

myMessage = myMessage + ProfitLossMonitor(6,MagicNumber6,Pr ofit6,myMessage);

onScreenComment(98,myMessage);

//----

//----

retorno(0);

}

string ProfitLossMonitor(int myGroupNumber,int myMagicNumber, int myProfit,string myMessage )

{

int total = EncomendasTotal();

dobro MyCurrentProfit=0;

string MyOrderNo=""";

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

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES);

if (OrderMagicNumber() == myMagicNumber)

{

MyCurrentProfit += OrderProfit();

MyOrderNo= MyOrderNo + "," + OrderTicket();

}

}

if(MyCurrentProfit>=myProfit)

CloseAll(myMagicNumber);

myMessage="Group Position #" + myGroupNumber + " " + myMagicNumber + "=" + myProfit + "(" + DoubleToStr(MyCurrentProfit,2) + " " + MyOrderNo + ")" + "\n" ;

retornar (myMessage);

}

CloseAll(int myMagicNumber)

{

int total = EncomendasTotal();

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

{

OrderSelect(cnt,SELECT_BY_POS,MODE_ TRADES);

if (OrderMagicNumber() == myMagicNumber)

if(OrderType()==OP_BUY)

OrderClose(OrderTicket(),OrderLots( ),Bid,5,Violet);

if(OrderType()==OP_SELL)

OrderClose(OrderTicket(),OrderLots( ),Ask,5,Violet);

}

}

vazio noScreenComment(int myEvent, string myComment)

{

interruptor (myEvent)

{

caso 98: Comentário(myComment); pausa;

}

}

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

Editar/eliminar mensagem

 
O problema com este EA é,

Open Transaction # 1 EURUSD (able to close)

Transação aberta nº 2 USDCFh (não poderá fechar)

NÃO SERÁ CAPAZ DE FECHAR A TRANSAÇÃO Nº 2.

Alguma idéia ?

Presumo que você esteja correndo a ea no gráfico do EURUSD no momento em que tentar fechar as ordens. já que essas posições estão fechando ok. Quando seu código tenta fechar o USDCHF(um pouco desleixado?) posiciona o mesmo usando o lance errado e ou pergunta, o preço de fechamento que usa é do par de moedas que a ea não está anexada ao preço do símbolo das possibilidades. Se você tentar fechar outro par de moedas a partir de um gráfico que não corresponda a essa moeda, você deve primeiro recuperar o preço correto antes de tentar fechá-lo.

keit

editar: Também a moeda, USDCHF neste caso deve ser exibida em sua janela de observação do mercado no momento em que você tentar recuperar as cotações corretas para fechar as ordens. Se o USDCHF não estiver listado na janela de observação do mercado, você não poderá obter qualquer cotação para aquele par.

 

Obrigado cockeyedcowboy !.

"você deve primeiro recuperar o preço correto antes de tentar fechá-lo".

Poderia sua parte a sintaxe ou função que pode fazer as necessidades acima;

 

como não negociar até o próximo bar

Eu tentei programar pela primeira vez, mas tenho um problema.

- Se eu fechar um negócio em um bar, só posso abrir um novo negócio quando o novo bar abrir.

Eu tentei o seguinte;

data/hora0=0;

int início()

se (tempo0 == Tempo[0]) retornar;

{

"código do programa".

}

tempo0 = Tempo[0];

retorno(0);

Se eu tirar esta parte, recebo várias entradas em vários bares. Com ela, recebo muito menos entradas (de 70 em um backtest. a 4), mas com entradas faltando.

Qualquer pessoa sabe o que estou fazendo de errado.

Obrigado de antemão.

 

Você pode usar a função NewBar() abaixo.

Como if(NewBar(){ ........programando aqui

bool NewBar() {

static datetime LastTime = 0;

if (Time[0] != LastTime) {

LastTime = Time[0];

return (true);

} else

return (false);

}

Você também pode querer testar para pedidos abertos se você quiser apenas um pedido de cada vez.

Espero que isso ajude.

Lux

 

Lux

Obrigado por sua ajuda com isto.

Acho que já descobri o que estava acontecendo no programa.

Eu estava anteriormente verificando uma nova barra no início, então o programa acabou de verificar o primeiro tique da nova barra para ver se concordava com meus sinais, sem verificar os outros tiquetaques. É por isso que poucos sinais de comércio vieram através do backtest.

Agora eu coloquei o código corretamente, (ou seja, onde está minha instução de pedido) parece estar funcionando bem.

Estou correto em meu raciocínio?

 

Por favor, ajude a atualizar o código de especialista.

Há um especialista simples. O código é claro e simples também, mas eu tenho um grande problema - o perito tem apenas UMA tentativa de abrir/fechar o pedido.

Alguém pode ajudar a consertá-lo?

O perito deve tentar 5-10 vezes para abrir/fechar o pedido.

Talvez n=número de tentativas, e por favor, sem "enquanto".

Muito obrigado.

Arquivos anexados:
test.mq4  9 kb
 

Meu código para "ajustar lotes após a perda", preciso de ajuda...obrigado

Meu código abaixo para "ajustar lotes após perda", mas fez uma massagem de erro"posição inicial incorreta 0 para a função ArraySort" durante os testes. Qualquer pessoa pode me ajudar a consertá-lo... precisa de ajuda...

double AdjtLotsByWinRate( int magicnumber,double NormLots)

{

int i,counter;

int ProfitAndTime[][2];

double Profits[];

//----

ArrayResize(ProfitAndTime,OrdersHistoryTotal());

for (i=0;i<OrdersHistoryTotal();i++)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

{

if (OrderType()<=OP_SELL && OrderMagicNumber()==magicnumber ) // 0 OP_BUY 1 OP_SELL 2 OP_BUYLIMIT 3 OP_SELLLIMIT 4 OP_BUYSTOP 5 OP_SELLSTOP

{

ProfitAndTime[counter][0]=OrderCloseTime();

ProfitAndTime[counter][1]=OrderProfit();

counter++;

}

}

}

ArrayResize(ProfitAndTime,counter);

ArrayResize(Profits,counter);

ArraySort(ProfitAndTime);

for (i=0;i<counter;i++)

{

Profits=ProfitAndTime[1];

}

//Print(Profits);

int err=GetLastError();

int WinRate_N=0,WinRate_A=5;

double WinRate;

for (i=counter;i<counter-WinRate_A+1;i--)

{

if (Profits>0){

WinRate_N=WinRate_N+1;

}

else if (Profits<0)

{

WinRate_N=WinRate_N-1;

}

else

{

WinRate_N=WinRate_N+0;

}

}

WinRate=WinRate_N/WinRate_A;

double NewLots;

if (WinRate>=0.7)

{

NewLots=NormLots*1.5;

}

else if (WinRate>=0.5 && WinRate<0.7)

{

NewLots=NormLots*1;

}

else if (WinRate>=0.3 && WinRate<0.5)

{

NewLots=NormLots*0.5;

}

else //if (WinRate<0.3)

{

NewLots=NormLots*0.1;

}

return(NewLots);

}

Razão: