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

 
Artyom Trishkin:

Entendo que você precisa de alguma forma indicar ao Consultor Especialista o bilhete da posição aberta manualmente, que você quer que ele arraste.

  1. Você deve acrescentar ao Expert Advisor o acompanhamento das posições recém-abertas e se não tiver um magik, isso significa que foi aberto manualmente. O Conselheiro Especialista deverá marcar a abertura desta posição no preço e na barra de sua abertura. O nome do objeto deve conter um prefixo com o nome comum do objeto para todos esses objetos, por exemplo "manual_" e o bilhete da posição também deve estar presente. Como resultado, o nome do objeto pode ser o seguinte: "manual_12345678". Aqui: manual_ - prefixo, 12345678 - bilhete de posição.
  2. Adicione ao Expert Advisor OnChartEvent() e monitore o evento do clique do mouse sobre o objeto. Analisar o nome do objeto e se ele contém um manual de substrato_, então procure por um número após o manual_. Este número é o bilhete da posição na qual você clicou.
  3. Então você precisa salvar o número encontrado para que ele não se perca quando reiniciar o EA/terminal/computador/mundo... Por exemplo, em recursos ou variáveis globais do terminal.
  4. O Conselheiro Especialista deve ler este recurso e tomar o bilhete da posição a ser arrancada dele
  5. No ciclo de arrasto, você deve ir buscar o bilhete da posição selecionada e procurar este número na lista de bilhetes salvos. Se tal bilhete for encontrado, a posição com este bilhete deve ser arrasto.
  6. Se o número de posições for alterado, o bilhete da posição fechada deve ser verificado e encontrado na lista gravada. Se tal bilhete existe na lista, deve ser excluído dessa lista - a posição não existe mais, e não há nada a ver com seu bilhete na lista de bilhetes para arrasto.
Algo parecido com isto. A lógica estava escrita em uma manivela, por isso não podia levar em conta algo...


Obrigado pelo esclarecimento, agora eu entendo o que quero dizer.

Para mim as lições de mql recomendam definir 3 (EURUSD), mas a liquidez das moedas é diferente e sua velocidade também. Quais são os números que podem ser usados como diretriz durante condições normais de mercado para pares de dólares e cruzamentos?

 
É possível preencher um buffer multidimensional com CopyOpen, CopyHigh, CopyLow e CopyClose? A descrição diz que ele copia para uma matriz dinâmica - mas uma matriz dinâmica pode ser multidimensional MQL5
 
Alexandr Sokolov:
É possível preencher um buffer multidimensional usando as funções CopyOpen, CopyHigh, CopyLow e CopyClose? A descrição diz que ele copia para uma matriz dinâmica - mas uma matriz dinâmica pode ser multidimensional MQL5

Use uma matriz unidimensional...

 
Alexandr Sokolov:
É possível preencher um buffer multidimensional usando as funções CopyOpen, CopyHigh, CopyLow e CopyClose? A descrição diz que ele copia em uma matriz dinâmica - mas uma matriz dinâmica pode ser multidimensional.

Se você tem dificuldade em entender as estruturas, você pode usar o ArrayCopyRates

int  ArrayCopyRates( 
   void&     dest_array[][],    // массив, переданный по ссылке 
   string    symbol=NULL,       // инструмент 
   int       timeframe=0        // таймфрейм 
   );

Se você tem uma boa compreensão disso, é melhor

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

Olá. Tentei construir um EA entre vários, tudo está funcionando corretamente no testador de estratégia (verifiquei-o no modo de visualização). Tentei usar uma conta demo e de vez em quando tive o seguinte problema, uma ordem é aberta e depois apagada, e isto acontece durante uma hora, até que a hora muda. Pensei que houvesse uma condição para entrar e excluir a ordem ao mesmo tempo, mas a exclusão é apenas a tempo, eu excluí todo este erro de bloco não desapareceu. Se alguém não for difícil, diga-me onde o erro ocorreu.

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
      
   CurrHour = TimeHour(TimeCurrent());
   
   if (CloseByTime == true && DayOfWeek() == DayEnd && CurrHour >= CloseHour)
   {
      if (CountTrades() > 0 || CountStop() > 0) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek() && CurrHour == StartHour && ((!SetLimits && CountStop() == 0) || (SetLimits && CountLimits() == 0)) && CountTrades() == 0)
   {
      high = iHigh(Symbol(), 0, 1);
      low  = iLow(Symbol(), 0, 1);
      spread = MarketInfo(Symbol(),MODE_SPREAD);
      
      if ((high - low)/Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble(high + Indent*Point, Digits);
         sell = NormalizeDouble(low - Indent*Point, Digits);
        
      
         if (FixedLot > 0)
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true)
         {
            if (AccountBalance() < abalance) 
               Lots = getlotlast();
            else abalance = AccountBalance();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread*Point - TPP*Point);
            tp_buy  = ND(buy + spread*Point + TPP*Point);
         
            sl_sell = ND(sell + SLP*Point+spread*Point);
            sl_buy  = ND(buy-SLP*Point-spread*Point);
            
          if (iClose(NULL,1440,1) < iMA(NULL,1440,PeriodMA,0,MODE_EMA,PRICE_CLOSE,1)) 
                  OrderSendReliable(Symbol(), OP_SELLSTOP, Lots, (sell-spread*Point), Slippage, sl_sell,  tp_sell, comment, Magic, 0, Red);
                                                                         
                                                                        else
                  OrderSendReliable(Symbol(), OP_BUYSTOP,  Lots, (buy+spread*Point),  Slippage, sl_buy, tp_buy,  comment, Magic, 0, Blue);
                                                                       
         
            
         }else
         {
            tp_sell = ND(sell - MathAbs(buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +  MathAbs(buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs(buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs(buy-sell)*StopLossK);
         
            OrderSendReliable(Symbol(), OP_SELLLIMIT, Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0, Red);
            OrderSendReliable(Symbol(), OP_BUYLIMIT,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0, Blue);
         }
      }
   }
   return(0);
}
 
craft11111:

Olá. Tentei construir um EA entre vários, tudo está funcionando corretamente no testador de estratégia (verifiquei-o no modo de visualização). Tentei usar uma conta demo e de vez em quando tive o seguinte problema, uma ordem é aberta e depois apagada, e isto acontece durante uma hora, até que a hora muda. Pensei que houvesse uma condição para entrar e excluir a ordem ao mesmo tempo, mas a exclusão é apenas a tempo, eu excluí todo este erro de bloco não desapareceu. Favor informar onde está o erro.

É necessário fazer um transbordo em um loop através daOrderSelect

int start()
{
   // модификация до безубытка
   if (MathAbs((OrderOpenPrice()-Ask)/Point) > BUP && CountBuy() > 0)
      ModifyLoss();

   if (MathAbs((OrderOpenPrice()-Bid)/Point) > BUP && CountSell() > 0)
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

Tanto quanto sei, quando ocorre uma condição, ocorre uma transição para a função de modificação onde apenas a seleção da ordem é utilizada. E também tentei remover esta peça, e nem sempre é visível qual condição ocorre.

void ModifyLoss()
{
   for (int trade = OrdersTotal() - 1; trade >= 0; trade--) 
   {
      OrderSelect(trade, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() != Symbol() || OrderMagicNumber() != Magic) continue;
      if (OrderType() == OP_BUY)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() < SL && (Ask - OrderOpenPrice())/Point>= BUP)
         {
            if (SL != ND(OrderStopLoss()))
               OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      } else
      if (OrderType() == OP_SELL)
      {
         SL = ND(OrderOpenPrice());
         if (OrderStopLoss() > SL && (OrderOpenPrice()-Bid)/Point >= BUP)
         {
            if (SL != ND(OrderStopLoss()))
                OrderModify(OrderTicket(), OrderOpenPrice(), SL, OrderTakeProfit(), 0);
         }
      }
   }
}
 
craft11111:

Olá. Tentei construir um EA entre vários, tudo está funcionando corretamente no testador de estratégia (eu o verifiquei no modo de visualização). Tentei usar uma conta demo e de vez em quando tive o seguinte problema, uma ordem é aberta e depois apagada, e isto acontece durante uma hora, até que a hora muda. Pensei que houvesse uma condição para entrar e excluir a ordem ao mesmo tempo, mas a exclusão é apenas a tempo, eu excluí todo este erro de bloco não desapareceu. Favor informar onde está o erro.

Você tem que escrever na função Imprimir(__FUNÇÃO__) ou na função Imprimir(bloco de sucção, parâmetros de sucção). Observe a ordem na qual as funções/blocos são acionados. O primeiro que desencadeou e não deveria ter desencadeado, é aí que está a questão. Confiar no fato de que "descrevi aqui condições bastante incompatíveis para seu acionamento simultâneo" não é uma boa idéia. Talvez a unidade não devesse ter acionado, mas parâmetros externos permitiram que ela acionasse, talvez algo dentro da unidade não devesse ter acionado.

 

OnChartEvent() não funciona no testador.

Por favor, mostre o botão que pode funcionar no testador. Por exemplo, clique sobre o qual irá levantar a bandeira comércio = verdadeiro; clique novamente? comércio = falso;

 
Ghabo:

OnChartEvent() não funciona no testador.

Por favor, mostre o botão que pode funcionar no testador. Por exemplo, clique sobre qual bandeira levantará o comércio = verdadeiro; clique novamente? comércio = falso;

Em OnTick() controle o botão de pressão. Você pode fazer por condição, se funcionar no testador - controle no OnTick(), mas no mundo real esse controle não será executado e será controlado no OnChartEvent()