Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 1481

 
MrBrooklin #:

Consegui agora. Obrigado!!! Acontece que, se houver pelo menos uma posição aberta, o código de erro 4753 nunca aparecerá.

Saudações, Vladimir.

Ele aparecerá se você escrever o seguinte

PositionSelect("мой символ");
 
Alexey Viktorov #:

Ele aparecerá se você escrever o seguinte

Oi Alexey, um esclarecimento. É necessário usar PositionSelect() em vez de um loop ou entendi algo errado novamente?

Atenciosamente, Vladimir.

 
MrBrooklin #:

Oi Alexey, um esclarecimento. É necessário usar PositionSelect() em vez de um loop ou eu entendi algo errado novamente?

Atenciosamente, Vladimir.

Você pode escrever da maneira que quiser, o principal é escrever um caractere inexistente para receber um erro...

 
Alexey Viktorov #:

Você pode escrevê-lo da maneira que quiser, o principal é escrever um caractere inexistente para obter um erro....

Mas não jogue chinelos em mim!!! Não consigo obter o código de erro. ((((

void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   string symb = "BrooklinUSDrfd";
   PositionSelect(symb);
   PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = ", symb, GetLastError());
  }

Saudações, Vladimir.

 
MrBrooklin #:
Erro = "
O especificador %lu deveria estar lá
 
Artyom Trishkin #:
Deveria haver um especificador lá

Obrigado Artem, funcionou!!! Muito obrigado a todos vocês!

Saudações, Vladimir.

 

Em resumo, resolvi o problema descrito aqui de uma maneira diferente:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   if(!PositionSelect(_Symbol))
      PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = %lu", _Symbol, GetLastError());
   int pos_total = PositionsTotal(); // объявим переменную для хранения количества открытых позиций
   if(pos_total > 0) // если есть открытые позиции
     {
      for(int i=0; i<pos_total; i++) // запустим цикл и переберём все открытые позиции
        {
         if(PositionGetSymbol(i) == _Symbol) // выберем все открытые позиции по текущему символу
           {
            ulong  pos_id = PositionGetInteger(POSITION_IDENTIFIER);
            double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = PositionGetDouble(POSITION_TP);
            double pos_sl = PositionGetDouble(POSITION_SL);
            PrintFormat("Позиция #%d цена = %G тейк-профит = %G стоп-лосс = %G", pos_id, pos_price, pos_tp, pos_sl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

Saudações, Vladimir.

 

Boa noite a todos!

Estou tentando criar uma função que abra uma posição adicional (sem stop and take) para uma posição aberta existente. Escrevi o código:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Add_Pos_Buyl()
  {
   for(int i=pos_total-1; i<pos_total; i++) // ищем последнюю по списку открытую позицию
     {
      PositionGetTicket(i); // получим тикет позиции по индексу в списке открытых позиций
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && // если совпадает символ открытой позиции
         PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && // если совпадает тип открытой позиции
         PositionGetInteger(POSITION_MAGIC) == Magic_Number) // и если совпадет мэджик
        {
         double pos_price_open=PositionGetDouble(POSITION_PRICE_OPEN); // объявим и инициализируем переменную для цены открытой позиции
         if(// тут задано условие для открытия позиции)
           {
            double new_price_pos=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            trade.Sell(0.01,_Symbol,new_price_pos,0,0);
           }
        } 
     }
  }

mas, por algum motivo, ele não vê a posição aberta. Tentei encontrar o problema com o depurador, mas depois de iniciar o loop, ele sai imediatamente da função sem ver o que está escrito dentro dele. Coloquei o ponto de interrupção em PositionGetTicket(i). Você poderia me dizer novamente onde há um erro no meu código?

Atenciosamente, Vladimir.

 
MrBrooklin posição aberta existente. Escrevi o código:

mas, por algum motivo, ele não vê a posição aberta. Tentei encontrar o problema com o depurador, mas depois de iniciar o loop, ele sai imediatamente da função sem ver o que está escrito dentro dele. Coloquei o ponto de interrupção em PositionGetTicket(i). Você poderia me dizer novamente onde há um erro no meu código?

Atenciosamente, Vladimir.

O que é pos_total?

 
Alexey Viktorov #:

Qual é o valor de pos_total?

Oi Alexey, a variável pos_total=PositionsTotal(), mas ela foi definida em nível global. Agora eu a movi para dentro da função e descobri que esse era o problema. Tudo funcionou. Qual é o problema? Eu não entendi o truque de jeito nenhum!!!

Agora, para fazer um experimento, movi o pos_total para o nível global novamente e ele parou de funcionar, mas quando o coloquei dentro da função, ele funcionou como deveria! Apenas alguns milagres, bem, pelo menos para mim!!!! )))

Acontece que uma variável em nível global não pode ser inicializada por uma função? É isso mesmo?

Atenciosamente, Vladimir.

Razão: