Perguntas de um "boneco" - página 33

 
Renat:
i>=0
Obrigado. Vergonha para mim)). Tantas vezes usei esta enumeração em mql4 e cometi um erro numa coisa tão simples.
 

Não é possível seleccionar uma posição. Por exemplo:

   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());
         }
      }

Há um erro no livro de bordo:

Como fazê-lo correctamente?

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

Não é possível seleccionar uma posição. Por exemplo:

Corrigir primeiro o erro, não confundir tipo de ordem e tipo de posição:

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

Não é possível seleccionar uma posição. Por exemplo:

Há um erro no livro de bordo:

Como fazê-lo correctamente?

Seria mais fácil para si perguntar onde se enganou...

Para que funcione, a construção

if(PositionSelect(SymbolName(count,true))) deve ser substituído por:

if(PositionSelect(PositionGetSymbol(count))

e ainda confundeENUM_ORDER_TYPE com ENUM_POSITION_TYPE

 
Rosh:

Corrigir primeiro o erro, não confundir tipo de ordem e tipo de posição:

Vladix:

Seria mais fácil para si perguntar onde não está enganado...

Obrigado e peço desculpa pelos meus erros realmente grosseiros. Este é um fenómeno temporário e o mal-entendido passará em breve).
 

Por favor, aconselhar como resolver este problema:

Estou a desenvolver Consultores Especialistas, bibliotecas e indicadores para MT5 em dois computadores.

Qual é a forma mais fácil de organizar a transferência de desenvolvimentos de um computador para outro, de preferência com sincronização automática. Isto é, pegar automaticamente no ficheiro mais recente e replicá-lo.

Os computadores estão na mesma rede. Existe uma pasta partilhada que é partilhada através da Internet.

 
usar VCS
 
TheXpert:
usar VCS
Eu não especifiquei computadores Windows7. A parte mais difícil é descobrir como se empilha os ficheiros no sistema de ficheiros. Com XP ficou tudo claro, havia um directório onde tudo estava dentro, mas aqui tudo está disperso.
 
Andrian22:
Eu não especifiquei computadores Windows7. A parte mais difícil é descobrir como se empilha os ficheiros no sistema de ficheiros. Com XP ficou tudo claro, havia um directório onde tudo estava, mas aqui tudo está disperso.
Ver Ajuda para Começar - Terminal de Lançamento - "Guest Mode" (com o interruptor /portátil)
 
Vladix:

Teria sido mais fácil para si perguntar onde acertou...

Para que funcione, a construção

if(PositionSelect(SymbolName(count,true))) deve ser substituído por:

if(PositionSelect(PositionGetSymbol(count))

Olhei para as diferentes variantes e reparei que todas elas são idênticas em termos do resultado final. Ou seja, cada uma destas opções:

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

... devolverá o mesmo resultado.

E no meu caso não afectou de forma alguma o resultado)))) Terminou o guião:

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

Agora tudo funciona correctamente. As variantes mencionadas acima são comentadas e podem ser comparadas. O resultado é sempre o mesmo no diário de bordo:

Razão: