Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1863

 

Fórum sobre comércio, sistemas automatizados de comércio e testes estratégicos

Qualquer pergunta de novatos sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos

GlaVredFX, 2022.01.17 18:59

Estou procurando o código para fechar pedidos e se eu não vir nenhum, abrirei um novo pedido.

Mas, por alguma razão, fecha apenas 1 ordem e pára antes do próximo sinal.

2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Sinal 1.1322 < fechar 1.1304 ExistPosSell 0
2022.01.17 16:22:08.389 2022.01.04 08:00:00 e: Sinal 1.1322 > fechar 1.1304 ExistPosBuy 1
2022.01.17 16:22:08.366 2022.01.04 08:00:00 e: Sinal 1.1325 < fechar 1.1306 ExistPosSell 0
2022.01.17 16:22:08.366 2022.01.04 04 04:00:00 e: Sinal 1.1325 > fechar 1.1306 ExistPosBuy 1
2022.01.17 16:22:08.327 2022.01.04 2022.01.04 00:00:00 e: Sinal 1.1326 < fechar 1.1296 ExistPosSell 0
2022.01.17 16:22:08.327 2022.01.04 00:00:00 e: Sinal 1.1326 > fechar 1.1296 ExistPosBuy 1
2022
.01.17 16:22:08.298 2022.01.03 20:00:00 e: Sinal 1.1328 < fechar 1.1283 ExistPosSell 0
2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: fechar #1 comprar 0,01 EURUSD a 1.13598 ao preço 1.12831

2022.01.17 16:22:08.298 2022.01.03 20:00:00 e: Sinal 1.1328 > fechar 1.1283 ExistPosBuy 1
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: abrir #4 comprar 0,01 EURUSD em 1.13512 ok
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Sinal 1.134 < fechar 1.135 ExistPosSell 0
2022.01.17 16:22:08.190 2022.01.03 16:00:00 e: Sinal 1.134 > fechar 1.135 ExistPosBuy 1

if(isNewBar()==true) {  
if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
     if(ExistPositions( NULL, OP_BUY, Magic) == true) //---------------- Если есть позиция BUY то
ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
         if(ExistPositions( NULL, OP_BUY, Magic) == False) //----------- если позиции BUY отсутствуют то
   ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию SELL

if(Signal < clos ) { //--------------------- МА ниже цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_SELL, Magic) == true) //---------------- Если есть позиция SELL то
 ClosePosWithMaxProfitInCurrency(); //---------------------закрытие одной позиции с максимальным профитом в валюте депозита.
        if(ExistPositions( NULL, OP_SELL, Magic) == False)  //----------- если позиции SELL отсутствуют то
  ticket=OpenPosition(NULL,OP_BUY, NDLot(Lot),0,0, Magic, Com);} //------------ открываем позицию BUY

} return; 
Se você prestar um pouco mais de atenção à sua pergunta e ao seu código, você verá por si mesmo qual é o problema.
 
Mihail Matkovskij #:

Se você prestar um pouco mais de atenção à sua pergunta e ao seu código, você verá por si mesmo.

A questão é que a 1 ordem mais lucrativa deve fechar em 1 barra, depois esperar por uma nova barra e fechar 1 ordem lucrativa novamente. Não devemos fechá-los todos de uma só vez.

Isto significa que fechamos no primeiro bar, mas nada acontece no bar seguinte.

 
GlaVredFX #:

A questão ali é que a 1 ordem mais lucrativa deve fechar em 1 barra, depois esperar por uma nova barra e fechar 1 ordem lucrativa novamente. Não se deve fechar todos de uma só vez.

Então você tem que formular suas perguntas corretamente. Você tem apenas 1 sinal. Você receberá apenas 1 sinal na abertura de um novo bar. Se houver apenas 1 sinal, quantos pedidos serão fechados? E somente se o sinal aparecer em um novo bar. E, se não houver sinal, as ordens serão fechadas nos próximos bares. Mais uma vez, se houver um sinal.

 
Mihail Matkovskij #:

Então você tem que formular as perguntas corretamente. Você recebe apenas 1 sinal. E está na abertura de um novo bar. E se houver apenas 1 sinal, quantos pedidos serão fechados? E somente se o sinal aparecer em um novo bar. E, se não houver sinal, as ordens serão fechadas nos próximos bares. E novamente, se houver um sinal.

Nesses casos, um fluxograma geralmente ajuda. Ou precisamos descrever o algoritmo em detalhes ponto por ponto em um pedaço de papel ou em um arquivo de texto. E só então você entenderá como escrever seu código.

 

Necessidade de função para fechar 1 ordem aberta primeiro entre todas as ordens disponíveis. que podem compartilhar.

 
GlaVredFX #:

Portanto, se você notou, o algoritmo está escrito no código.

1) Aparece uma nova barra

2) Se o MA for superior ao preço de fechamento da barra anterior, vá para o passo 3 se o MA for inferior ao preço de fechamento, vá para o passo 4.

3)Se tivermos uma posição COMPRAR, fechamos uma posição com o máximo lucro no par de moedas.

3.1)Se não houver ordens de COMPRA abertas, abra uma posição de VENDA.

4) Se tivermos uma posição COMPRAR, fechamos uma posição com um lucro máximo no par de moedas.

4.1)Se não houver nenhuma ordem de VENDA em aberto, abrimos uma posição de COMPRA.


Agora novamente tenho uma pergunta, o que está errado neste código do algoritmo descrito acima:

Este código contém um conjunto de comandos. O terminal não sabe o que você precisa, ele só sabe o que está escrito no código!

...

if(isNewBar()) {  
  if(Signal > clos ) {  //--------------------- МА выше цены закрытия предыдущего бара.
    if(ExistPositions( NULL, OP_BUY, Magic)) //---------------- Если есть позиция BUY то
      ClosePosWithMaxProfitInCurrency(); //--------  закрытие одной позиции с максимальным профитом в валюте депозита.
    if(!ExistPositions( NULL, OP_BUY, Magic)) //----------- если позиции BUY отсутствуют то
      sellSignal = true;
  } 

 // и аналогично для п.4.

} 
return; 

...

void OnTimer() {
  if (sellSignal) {
    ticket=OpenPosition(NULL,OP_SELL, NDLot(Lot),0,0, Magic, Com); //------------ открываем позицию SELL
    sellSignal = false;
  }
  // и аналогично для buy
}
Escreva as variáveis buySignal esellSignal globalmente.
 
Mihail Matkovskij #:

Um conjunto de comandos está escrito no código. O terminal não sabe o que você precisa, ele só sabe o que está escrito no código!

Eu apaguei esta mensagem porque o problema é que as ordens devem ser fechadas não por lucro, mas por tempo.

Isto porque nem sempre temos lucro e nem sempre onde ele deveria estar.

Portanto, precisamos da função"Fechar uma posição aberta logo no início de todas as posições disponíveis".

 
GlaVredFX #:

Eu apaguei esta mensagem, porque o problema é que as ordens devem ser fechadas de acordo com o tempo e não com o lucro.

Porque o lucro nem sempre está lá e nem sempre onde ele deveria estar.

Portanto, precisamos da função"Fechar uma posição aberta logo no início de todas as posições disponíveis".

Eu adicionei um exemplo de abertura de posição no temporizador no posto anterior. Para que a posição seja garantida a abertura. Lá você pode substituir sua própria função.

 
Mihail Matkovskij #:

Acrescentei um exemplo de abertura de uma posição temporizada no posto anterior. Para que a posição seja garantida a abertura. Lá você pode substituir sua própria função.

Mas não desta forma. Você precisa monitorar o resultado de

ClosePosWithMaxProfitInCurrency

ou uma nova função sua na OnTradeTransaction. E se não houver posições, ele entrará. Ou escreva o sinal em buySignal ousellSignal e processe-o em OnTimer, como mostrei no exemplo.

 
Mihail Matkovskij #:

Mas não é assim. Você precisa acompanhar o resultado de

ou sua nova função na OnTradeTransaction. E se não houver vagas, você deve entrar. Ou escreva o sinal em buySignal ousellSignal e processe-o em OnTimer, como mostrei no exemplo.

ClosePosWithMaxProfitInCurrency

Esta função não é mais relevante. Não é adequado. Ao invés disso, precisamos substituir a função que fechará uma ordem aberta primeiro, se ela existir.

Não entendo as variáveis buySignal esellSignal escritas no escopo global. Mas quando eu tento compilá-lo, isso me dá o seguinte erro

'sellSignal' - some operator expected   

expression has no effect        

'buySignal' - some operator expected    

expression has no effect