[ARQUIVO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Em nenhum lugar sem você - 4. - página 421

 

Boa tarde, fiz um bloco para calcular posições mágicas de compra abertas, mas o problema é que se o bloco funciona em pares de moedas diferentes, então o bloco só produz resultados para um par de moedas (a última posição aberta). Como posso corrigir o código (sem mudar a magia) para que o bloco dê o resultado para cada par de moedas?

int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
 
int OpenMagicOrderCount_buy() 
{
   int OpenBuyOrdersCount = 0;
   int OpenOrders = 0;
   int cnt = 0;
   OpenOrders=OrdersTotal();
   for(cnt=0;cnt<OpenOrders;cnt++)   // scan all orders and positions. ..
   {
     OrderSelect(cnt, SELECT_BY_POS);
          if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
          {                             
                  OpenBuyOrdersCount ++;
          }
   } 
   Print("+++++++++++++++++++++++OpenBuyOrdersCount: " + OpenBuyOrdersCount,"   OrderSymbol()= ", OrderSymbol());
   return(OpenBuyOrdersCount); 
}
так все " Os mágicos"OP_BUY" contarão
 
7777877:

... continuou...

No final da subseção Função StringSubstr entre parênteses é dada a seguinte frase: "separadamente devemos observar que no primeiro para loop (minha nota: deve ser deinit() pois não há outra maneira de apagar objetos) não podemos apagar objetos, pois após cada deleção o número total de objetos e sua numeração mudará e alguns nomes de objetos serão ignorados". Mas na citada EA não há nenhum segundo para o loop. Além disso, a variável Quant_Del definida na função deinit() antes do for loop é inicializada com zero, enquanto a variável i não foi definida em nenhum lugar antes do for loop.

Acontece que o código acima omite apenas trivialmente várias linhas de programa.

Então a primeira pergunta é a seguinte: foi realmente uma omissão trivial de várias linhas ou é um programa tão complicado que um novato não consegue entender seu significado sem ajuda externa?

Além disso... No mesmo capítulo da mesma seção, há um link para o mesmo Expert Advisor (no arquivo anexo) antes do texto citado que, ao ser clicado, abre o mesmo Expert Advisor no MetaElitor. Mas o texto deste Expert Advisor é diferente: a função deinit()deinit()aqui se parece com isto

Então, se "combinar" a frase "Separadamente, note que você não pode excluir objetos no primeiro para loop, porque neste caso o número total de objetos e sua numeração mudará após cada exclusão, e alguns nomes de objetos serão pulados" etexto deinit() função da última variante, tenho a segunda pergunta:

Pergunta. Por que não posso excluir objetos no primeiro para loop colocando a função ObjectDelete(Obj_Name) dentro da declaração if ?

Por que depois de cada eliminação "... O número total de objetos vai mudar"...? Porque neste caso, a variável Quant_Objects, que determina o número total de objetos, obtém seu valor igual a ObjectsTotal(), FORWARD the for loop?

P.S. Obrigado antecipadamente pela resposta, a fim de não desperdiçar o fórum.

Vire o ciclo para trás e exclua o quanto quiser
 
FAQ:
Expandir o loop para trás e apagar o máximo que você puder

Eu o entendi corretamente? Você deve pensar na função deinit (e no laço em particular) da seguinte forma:

int deinit()                           // Спец. функция deinit()
  {
   int Quant_Objects=ObjectsTotal();   // Cтолько всего ВСЕХ объектов
   for(int k=Quant_Objects; k>=0; k--) // По количеству объектов 
     {
      string Obj_Name=ObjectName(k);   // Запрашиваем имя объекта
      string Head=StringSubstr(Obj_Name,0,6);// Извлекаем первые 6 сим
      if (Head==Prefix)                // Если найден объект, …
        {                              // ... начинающийся с Paint_,
         ObjectDelete(Obj_Name);       // … то его и удаляем
        }                              //конец if
     }                                 //конец for
   return;                             // Выход из deinit()
  }                                    //конец deinit
//-------------------------------------------------------------- 10 --
 
Elektronik:


Estes dados são necessários para calcular a diferença entre as ordens de compra e venda.

vamos assumir que uma ordem de compra com o volume de 0,09 lotes e duas ordens de venda com o volume total de 0,11 lotes foram abertas, a diferença entre elas será de 0,09-0,11=-0,02, ou se possível a diferença entre seus valores.


Bem, então a função OrderLots.
 
abeiks:

Boa tarde, fiz um bloco para calcular posições mágicas de compra abertas, mas o problema é que se o bloco funciona em pares de moedas diferentes, então o bloco só produz resultados para um par de moedas (a última posição aberta). Como posso corrigir o código (sem mudar a magia) para que o bloco calcule para todos os pares de moedas?

Mudança:

if (OrderSymbol()==Symbol() && OrderMagicNumber()==magic &&  OrderType() == OP_BUY )

Para:

if (OrderMagicNumber()==magic &&  OrderType() == OP_BUY )
 
Como substituir o stop loss em pips no EA, por um stop loss acima da última vela?
 
Neo777:
Como substituir o stop loss em pips no EA, por um stop loss acima da última vela?
double x = ... // Задаем на сколько пипсов выше
double sl = NormalizeDouble(High[1] + x * Point, Digits); // Задаем значение стоплосс на x пипсов выше предпоследней свечи
 

Reshetov:спасибо
извиняюсь за то что не в SRC

como inseri-lo aqui

 
7777877:

Eu o entendi corretamente? Você deve pensar na função deinit (e no laço em particular) da seguinte forma:


Correto, neste caso removendo por exemplo 18 objetos, 19 torna-se seu lugar, 19=>18, ou seja, uma iteração inversa é obtida automaticamente. Use isto também para pedidos.

Além disso, como a lista de objetos e ordens são formalmente matrizes a partir de = 0, o índice máximo será um a menos do que o tamanho da matriz:

int Quant_Objects=ObjectsTotal()-1;
Razão: