Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 1481

 
MrBrooklin #:

L'ho ricevuto ora. Grazie!!! Risulta che se c'è almeno una posizione aperta, il codice di errore 4753 non compare mai.

Saluti, Vladimir.

Apparirà se si scrive quanto segue

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

Verrà visualizzato se si scrive questo

Ciao Alexey, un chiarimento. È necessario utilizzare PositionSelect() invece di un ciclo, o ho di nuovo frainteso qualcosa?

Saluti, Vladimir.

 
MrBrooklin #:

Ciao Alexey, un chiarimento. È necessario usare PositionSelect() invece di un ciclo o ho di nuovo frainteso qualcosa?

Saluti, Vladimir.

Puoi scriverlo come vuoi, l'importante è scrivere un carattere inesistente per ottenere un errore...

 
Alexey Viktorov #:

Si può scrivere in qualsiasi modo, l'importante è scrivere un carattere inesistente per ottenere un errore....

Ma non tiratemi le ciabatte!!! Non riesco ad ottenere il codice di errore. ((((

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

Saluti, Vladimir.

 
MrBrooklin #:
Errore = "
Lo specificatore %lu dovrebbe essere presente
 
Artyom Trishkin #:
Dovrebbe esserci uno specificatore

Grazie Artem, ha funzionato!!! Grazie a tutti!

Saluti, Vladimir.

 

In breve, ho risolto il problema descritto qui in un modo diverso:

//+------------------------------------------------------------------+
//| 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);
           }
        }
     }
  }
//+------------------------------------------------------------------+

Saluti, Vladimir.

 

Buonasera a tutti!

Sto cercando di creare una funzione che apra una posizione aggiuntiva (senza stop and take) ad una posizione già aperta. Ho scritto il codice:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
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);
           }
        } 
     }
  }

ma per qualche motivo non vede la posizione aperta. Ho cercato di trovare il problema con il debugger, ma dopo aver avviato il ciclo esce immediatamente dalla funzione senza vedere ciò che è scritto al suo interno. Ho messo il punto di interruzione a PositionGetTicket(i). Potreste dirmi di nuovo dove ho un bug nel mio codice?

Cordiali saluti, Vladimir.

 
MrBrooklin posizione già aperta. Ho scritto il codice:

ma per qualche motivo non vede la posizione aperta. Ho cercato di trovare il problema con il debugger, ma dopo aver avviato il ciclo esce immediatamente dalla funzione senza vedere ciò che è scritto al suo interno. Ho messo il punto di interruzione su PositionGetTicket(i). Potreste dirmi di nuovo dove ho un bug nel mio codice?

Cordiali saluti, Vladimir.

Che cos'è pos_total?

 
Alexey Viktorov #:

A cosa è uguale pos_totale?

Ciao Alexey, la variabile pos_total=PositionsTotal(), ma era impostata a livello globale. Ora l'ho spostata all'interno della funzione ed è risultato che il problema era questo. Tutto ha funzionato. Qual è il problema? Non ho capito il trucco!!!

Ora, per fare un esperimento, ho spostato di nuovo pos_totale a livello globale e ha smesso di funzionare di nuovo, ma quando l'ho messo all'interno della funzione, funziona come dovrebbe! Solo qualche miracolo, beh, almeno per me!!!! )))

Risulta che una variabile a livello globale non può essere inizializzata da una funzione? È così?

Saluti, Vladimir.