Domande da un "manichino" - pagina 33

 
Renat:
i>=0
Grazie. Vergogna.)) Tante volte ho usato questa enumerazione in mql4 e ho fatto un errore su una cosa così semplice.
 

Non è possibile selezionare una posizione. Per esempio:

   double Stop_Loss   = NormalizeDouble(OrderGetDouble(ORDER_SL),_Digits);
   double Open_Price  = NormalizeDouble(OrderGetDouble(ORDER_PRICE_OPEN),_Digits);
   
   double Amount_Risk = 0.0;
         
   for(count = PositionsTotal()-1; count >= 0; count--)
      {
       if(PositionSelect(SymbolName(count,true)))
         {
          int tp_pos;
          tp_pos = (ENUM_ORDER_TYPE)PositionGetInteger(POSITION_TYPE);
          if(tp_pos == ORDER_TYPE_BUY || tp_pos == ORDER_TYPE_SELL) 
            {
             Amount_Risk = MathAbs(Open_Price - Stop_Loss);
             Print("PositionTotal(): ",PositionsTotal(), " Amount_Risk: ",Amount_Risk);
            }
          if(GetLastError() != 0) Print(ErrorDescription(GetLastError()),", ",GetLastError());
         }
      }

C'è un errore nel registro:

Come farlo correttamente?

Документация по MQL5: Торговые функции / PositionSelect
Документация по MQL5: Торговые функции / PositionSelect
  • www.mql5.com
Торговые функции / PositionSelect - Документация по MQL5
 
tol64:

Non è possibile selezionare una posizione. Per esempio:

Correggete prima l'errore, non confondete il tipo di ordine e il tipo di posizione:

 tp_pos = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
 
tol64:

Non è possibile selezionare una posizione. Per esempio:

C'è un errore nel registro:

Come farlo correttamente?

Sarebbe più facile per te chiedere dove hai sbagliato...

Per farlo funzionare, il costrutto

if(PositionSelect(SymbolName(count,true)) dovrebbe essere sostituito con:

se(PositionSelect(PositionGetSymbol(count))

e inoltre confondeteENUM_ORDER_TYPE con ENUM_POSITION_TYPE

 
Rosh:

Correggi prima l'errore, non confondere il tipo di ordine e il tipo di posizione:

Vladix:

Sarebbe più facile per te chiedere dove non ti sbagli...

Grazie e mi scuso per i miei errori davvero grossolani. Questo è un fenomeno temporaneo e il malinteso passerà presto).
 

Per favore, consigliate come risolvere questo problema:

Sto sviluppando Expert Advisors, librerie e indicatori per MT5 su due computer.

Qual è il modo più semplice per organizzare il trasferimento degli sviluppi da un computer all'altro, preferibilmente con la sincronizzazione automatica. Cioè prendere automaticamente il file più fresco e replicarlo.

I computer sono sulla stessa rete. C'è una cartella condivisa che è condivisa su internet.

 
utilizzare VCS
 
TheXpert:
utilizzare VCS
Non ho specificato i computer Windows7. La parte più difficile è capire come si impilano i file nel file system. Con XP era tutto chiaro, c'era una directory in cui c'era tutto, ma qui tutto è sparso.
 
Andrian22:
Non ho specificato i computer Windows7. La parte più difficile è capire come si impilano i file nel file system. Con XP era tutto chiaro, c'era una directory dove c'era tutto, ma qui tutto è sparso.
Vedere Guida introduttiva - Lanciare il terminale - "Modalità ospite" (con l'interruttore /portable)
 
Vladix:

Sarebbe stato più facile per te chiedere dove hai capito bene...

Per farlo funzionare, il costrutto

if(PositionSelect(SymbolName(count,true)) dovrebbe essere sostituito con:

se(PositionSelect(PositionGetSymbol(count))

Ho guardato le diverse varianti e ho notato che sono tutte identiche in termini di risultato finale. Cioè, ognuna di queste opzioni:

 if(PositionSelect(Symbol()))
 if(PositionSelect(PositionGetSymbol(count)))
 if(PositionSelect(SymbolName(count,true)))

... restituirà lo stesso risultato.

E nel mio caso non ha influenzato il risultato in alcun modo))) Finito lo script:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
 for(int count = 0; count < PositionsTotal(); count++)
   {
    double Amount_Risk = 0.0;
    string Type_pos;
    
    if(PositionSelect(Symbol()))
    //if(PositionSelect(PositionGetSymbol(count)))
    //if(PositionSelect(SymbolName(count,true)))
      {
       int tp_pos = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
       string Symbol_pos = PositionGetSymbol(count);
       double Acc_Blnc   = AccountInfoDouble(ACCOUNT_BALANCE);
       double Order_Lots = PositionGetDouble(POSITION_VOLUME);
       double Stop_Loss  = NormalizeDouble(PositionGetDouble(POSITION_SL),_Digits);
       double Open_Price = NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),_Digits);
       
       switch(tp_pos)
         {
          case 0 : Type_pos = "LONG";  break;
          case 1 : Type_pos = "SHORT"; break;
         }
       
       Amount_Risk += MathAbs(((((Open_Price - Stop_Loss)*10000)*(Order_Lots*10))/Acc_Blnc)*100);
       
       Print("PositionTotal(): ",PositionsTotal(),", Symbol: ",Symbol_pos,", Position: ",Type_pos,", Amount_Risk: ",DoubleToString(Amount_Risk,2),"%");

       if(GetLastError() != 0) Print(ErrorDescription(GetLastError()),", ",GetLastError()); ResetLastError();
      }
   }
}

Ora tutto funziona correttamente. Le varianti di cui sopra sono commentate e si possono confrontare. Il risultato è sempre lo stesso nel registro: