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

 
Motzaart:

Boa tarde.

Em um Expert Advisor com várias moedas, preciso fechar um pedido pendente contra um lucro quando uma posição aberta é acionada.

Agora mesmo, quando eu fecho uma ordem pendente com lucro, todas as ordens pendentes para todas as moedas são fechadas.

Como posso alterar o código para que somente a ordem pendente relacionada a um par de moedas seja fechada e o resto das ordens pendentes permaneçam abertas?

O que devo mudar neste código?

Mn neste código é um número mágico de uma ordem pendente BUY_STOP ou SELL_STOP.

A lógica é que quando uma posição aberta é fechada no Take Profit, este número mágico é deixado e o comando para apagá-lo é suposto ser executado.

Isto funciona ao testar cada par. Entretanto, quando se trabalha com outras moedas, todos os pedidos feitos em todos os pares são excluídos.

Por favor, ajude, se você puder.

Entendo que ninguém deveria se preocupar com este problema, mas talvez alguém tenha um modelo pronto?

Eu ficaria muito grato.

Tive que copiar o código para o editor e fazer algum estilo normal (Ctrl+<) para entender o que você estragou lá.

Então: comentei no código o que estava bagunçado lá em cima:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   operation=0; // неиспользуемая переменная
     { // лишняя скобка
      for(int i=OrdersTotal()-1; i>=0; i--)
        {
         OrderSelect(i, SELECT_BY_POS); // нет проверки на результат выделения ордера в списке, и если ордер не выбран, то всё последующее вызовет ошибки
         int  type   = OrderType();
         bool result = false;
         switch(type)
           { // К СВЕДЕНИЮ - ВСЕ ОПЕРАТОРЫ break ЗАКОММЕНТИРОВАНЫ, А ЗНАЧИТ - ВСЕ СТРОКИ КОДА ОПЕРАТОРА switch ВЫПОЛНЯЮТСЯ ВСЕГДА
            case OP_BUYSTOP   : // Если выбран отложенный BuyStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, Red);  //break;
            case OP_SELLSTOP  : // Если выбран отложенный SellStop, то пытаемся его закрыть как позицию, что вызовет ошибку
               result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, Red);   //break;
               // Независимо от типа выбранного ордера (отложенный или позиция) удаляем его как отложенный, что для позиции вызовет ошибку
               result = OrderDelete(OrderTicket());  //break;
           }
        }
     } // лишняя скобка
  }
//+------------------------------------------------------------------+

Como resultado, seu código faz isto, ou seja, é equivalente a este código:

//+------------------------------------------------------------------+
if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?
  {
   bool result=false;
   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(!OrderSelect(i, SELECT_BY_POS)) {}
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 5, clrRed);
      result = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 5, clrRed);
      result = OrderDelete(OrderTicket());
     }
  }
//+------------------------------------------------------------------+

Agora pergunte - o que você queria ganhar com isso?

 
Artyom Trishkin:

Para entender o que você estragou lá, tive que copiar o código para o editor e fazer um estilo adequado (Ctrl+<).

Então: comentou no código o que você estragou lá em cima:

Como resultado, seu código faz isto, ou seja, é igual a este código:

Agora pergunte - o que você queria ganhar com isso?

OK.

if(OrderMagicNumber()==Mn)  // а ордер где-то был выбран ранее?

aqui:

extern int mn;//магический номер открытой позиции
int Mn=10*mn; //магический номер отложенного ордера
int TimFr1=72,TimFr2=24,TimFr3=24;

int start()
 {if(Symbol()=="EURUSD")mn=1;if(Symbol()=="GBPUSD")mn=2;if(Symbol()=="USDCHF")mn=3;if(Symbol()=="USDJPY")mn=4;
  if(Symbol()=="USDCAD")mn=5;if(Symbol()=="EURGBP")mn=6;if(Symbol()=="AUDUSD")mn=7;if(Symbol()=="NZDUSD")mn=8;
  if(Symbol()=="EURJPY")mn=9;if(Symbol()=="EURCHF")mn=10;

Quando uma posição é aberta (OP_BUY ou OP_SELL ), colocamos simultaneamente ordens pendentes (OP_SELLSTOP e OP_BUYSTOP), respectivamente.

Ao fechar uma posição em aberto no take profit, a ordem pendente correspondente a ela deve ser cancelada. Este algoritmo é aplicado a todos os pares de moedas.

Outras encomendas pendentes feitas em outras moedas devem permanecer.

 

Bom dia a todos vocês!

Há um indicador MTF_RSI está mudando

input ENUM_TIMEFRAMES      TimeFrame   =  0;

Você pode me dizer se é possível definir a mudança automática do TimeFrame ao mudar o gráfico?

Algo como

if(TimeFrame=Period())
   TimeFrame="Следующий период";        
 
MakarFX:

Bom dia a todos vocês!

Há um indicador MTF_RSI está mudando

Você pode me dizer se é possível definir a mudança automática do TimeFrame ao mudar o gráfico?

Algo como isto

Criar uma estrutura ou uma matriz multidimensional e deixá-la funcionar na dimensão desejada, se o critério for cumprido, trabalhar com uma coluna (cada coluna é responsável por seu próprio cronograma), se não com outra coluna, e isso é tudo. O programa em si tem acesso a todos os prazos de uma só vez, portanto o que você escreve é possível, mas a implementação é muito extensa e você não pode ver esta quantidade de trabalho no fórum, porque é muito extensa.

 
Seric29:

Criar uma estrutura ou matriz multidimensional

Obrigado.

 

Por que este código não funciona?

typedef double(*CenBr)(string,int,int);CenBr cn_br[4];//глобально
//В Ините пытюсь сохранить указатель на функцию iOpen и ничего не выходит
cn_br[0]=iOpen;

Funciona com funções simples, mas há algo de estranho nisso.

 
MakarFX:

Obrigado.

создаём массив double BarOCLH[1000][2][4]
далее сохраняем цену открытия 0 вого бара дневного таймфрейма
BarOCLH[0,0,0]=iOpen ();
далее сохраняем цену открытия 0 вого бара часового таймфрейма
BarOCLH[0,1,0]=iOpen ();и т.д ну а дальше критерируйте с каким столбцом работать
 
Seric29:
Você está falando comigo?
 
MakarFX:
Você está falando comigo?

Sim para você. Você terá que trabalhar através do jogo com prazos em cada detalhe em cada loop e em cada função. É por isso que eu recomendo o uso de matrizes multidimensionais.

 
Seric29:

Sim para você. Você terá que trabalhar através do jogo com prazos em cada detalhe em cada loop e em cada função. É por isso que eu recomendo o uso de matrizes multidimensionais.

Esta questão é resolvida mais facilmente:

   switch(period)
     {
      case PERIOD_M1  : TimeFrame = PERIOD_M5;  break;
      case PERIOD_M5  : TimeFrame = PERIOD_M15; break;
      case PERIOD_M15 : TimeFrame = PERIOD_M30; break;
      case PERIOD_M30 : TimeFrame = PERIOD_H1;  break;
      case PERIOD_H1  : TimeFrame = PERIOD_H4;  break;
      case PERIOD_H4  : TimeFrame = PERIOD_D1;  break;
      case PERIOD_D1  : TimeFrame = PERIOD_W1;  break;
      case PERIOD_W1  : TimeFrame = PERIOD_MN1; break;
      case PERIOD_MN1 : TimeFrame = PERIOD_MN1; break;
      default :        return(INIT_FAILED);
     }
Razão: