[ARQUIVO] Qualquer pergunta de novato, de modo a não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 3. - página 524

 
sss2019:

Meu Expert Advisor abre três ordens em meu terminal, em algum momento deve fechar as três ordens, mas por alguma razão fecha apenas duas, não dá erros.

Aqui está esta peça que deve fechar negócios

Não entendo o que está errado e por que apenas dois negócios são fechados. Por favor, me diga quem sabe o quê.

if(OrderSelect(i, SELECT_BY_POS) == false) continue;
 
Vinin:


Fazer o ciclo de forma diferente


No entanto, isto também não ajudou. Não rearranjar o laço ou substituir a continuidade não ajudou, como se a EA não visse suas próprias três ordens, e apenas apagasse duas.

 
Reverter a direção do recálculo do ciclo
 
Pegue-o e use-o.
Arquivos anexados:
 
Às vezes as coisas são tão incompreensíveis, nada lógicas, acho que há erros no próprio ambiente terminal.
 
sss2019:
Às vezes as coisas são tão incompreensíveis, nada lógicas, acho que há erros no próprio ambiente terminal.
Para que pareça menos necessário começar pelo estudo de um livro didático e um manual. Em seguida, tente encontrar explicações sobre questões semelhantes no fórum.
 
sss2019:

Como você organizaria melhor o drawdown máximo do EA, no qual ele deixa de funcionar, você pode definir uma variável estática que acumulará a quantidade de perdas?

O Expert Advisor deve parar de trabalhar, mas começará a trabalhar novamente após reiniciar ou mudar os parâmetros.


Ao inicializar uma EA, você pode salvar o saldo atual em uma variável estática. E na função Iniciar, você pode verificar quantos por cento do saldo atual diminuiu em relação ao saldo inicial e se a porcentagem é mais do que admissível - proibir a comercialização. Resumidamente, sem nenhum código. Após o reinício, o consultor especializado se lembrará do novo equilíbrio inicial.
 
MrSoros:

Ao inicializar o Expert Advisor, o saldo atual pode ser salvo em uma variável estática. E na função Start, verifique quanto o saldo atual escorregou do saldo inicial, e se a porcentagem é maior do que o permitido - o comércio é proibido. Resumidamente, sem nenhum código. Após o reinício, o Consultor Especialista se lembrará do novo equilíbrio inicial.

Você já entendeu a pergunta?
 
MrSoros:

1. Ao inicializar o Expert Advisor, você pode salvar o saldo atual em uma variável estática. Então a função Start verifica em quantos por cento o saldo atual escorregou do saldo inicial e se a porcentagem exceder o valor permitido, o comércio será proibido. Em resumo, sem nenhum código.

2. Após o reinício, o avaliador se lembrará do novo equilíbrio original.

1. Você pode. Eu tenho esta opção (com código) - você mesmo inicializa as variáveis:

extern int MaxLoss = 90;          // Максимально допустимая просадка в процентах от баланса
int  orderIndex;
bool IsExpertFailed = false;
bool IsExpertStopped = false;
double lots;                       // вспомогательная переменная для расчета нового размера лота 
double Lots_New;                   // Количество лотов для новых ордеров
int ticket;                        // Номер ордера
double orderLots;                  // Lots   
double orderProfit;                // Profit
double Price;                      // Цена открытия рыночного ордера
double SL;                         // Значение StopLoss ордера
double  TP;                        // Значение TakeProfit ордера
static datetime prevtime = 0;       // по ценам открытия
int start()
{  
   if (IsExpertStopped)
   {
      Comment("Не удалось инициализировать советник!");
      return (0);
   }
   
   if (IsExpertFailed)
   {
      Comment("Критическая ошибка! Советник остановлен.");
      return (0);
   }
      Level_new=MarketInfo(Symbol(),MODE_STOPLEVEL );    
 
   int orderCount = 0;  
      // ------------------------------------------------Учет ордеров только ЭТОГО ЭКСПА---------------------------

   int orderType;
   for (orderIndex = (OrdersTotal() - 1); orderIndex >= 0; orderIndex--)
     {  
      if (!OrderSelect(orderIndex, SELECT_BY_POS))    continue;
      if ((OrderSymbol() != Symbol()) || (OrderMagicNumber() != magic))    continue;

      orderType = OrderType();
      if ((orderType != OP_BUY) && (orderType != OP_SELL))     continue;
          ticket = OrderTicket( );                         // Номер ордера
          orderLots = OrderLots();                         // Lots   
          orderProfit = OrderProfit() + OrderSwap();       // Profit
          Price = OrderOpenPrice();                        // Цена открытия рыночного ордера
          SL =  OrderStopLoss();                           // Значение StopLoss ордера
          TP = OrderTakeProfit();                          // Значение TakeProfit ордера
          
             if (ticket>0)                                               // Если позиция открылась
                    {
                             while(OrderSelect(ticket,SELECT_BY_TICKET)==false)       // Если ордер выбран
                                 {
                                   Sleep(100);
                                 }
                                  double OpenPrice=OrderOpenPrice();
                    }
          // Проверка на предельную просадку      
      double loss = - ((orderProfit * 100.0) / AccountBalance());
      if (loss > MaxLoss)
      {
         Print ("MaxLoss");
         CloseAllOrders(magic);
         IsExpertFailed = true;
         return (0);
      }        
         
      orderCount++;                     // считаем ордера (не больше i)                   
     
    }   

2. Não. Não se lembrará do nível de equilíbrio que existia antes do início deste EXPERTADOR pela primeira vez. Só se lembrará do nível atual na variável

AccountBalance()

. para esta conta.

 

Boa tarde! Eu tinha uma pergunta antes sobre a representação correta das citações em Excel. Esta pergunta foi respondida graças aocusto .Agora eu tenho uma pergunta, é possível fazer (sem MQL5 e dll) os dados para mais moedas a serem carregadas? O esquema é mostrado abaixo, ao invés de "..." os valores das datas correspondentes, os valores dos preços de fechamento e o período atual.

Presumo que a resposta à pergunta envolverá possíveis correções ao meu código. Estou anexando ao arquivo o código do Expert Advisor que escreve valores de preços de fechamento para um, instrumento financeiro atual.

#property copyright "S.I.Shlikov"
#property link      ""
int init()  
  {
   string Name=Symbol();
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,"Date",Name,"Period",Period());
   FileClose(h);        
  }
int start()
  {
   int h=FileOpen(Symbol()+"-"+Period()+".csv",FILE_CSV|FILE_WRITE|FILE_READ,";");
    if(h<1)
      {
      Print("Файл не найден : ", GetLastError());
      return(false);
      }
   string Wtime=TimeToStr(TimeCurrent(),TIME_DATE|TIME_MINUTES);
   FileSeek(h, 0, SEEK_END);
   FileWrite(h,Wtime,NormalizeDouble(Close[0], Digits));
   FileClose(h);   
   return(0);
  }