[ARQUIVO]Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por ela. Não posso ir a lugar nenhum sem você - 5. - página 334

 
hoz:


Boris, se você comentar uma das condições em GetGeneralSignal(), a abertura é clara.

Eu o localizei. A bandeira não muda seu valor quando a rentabilidade dos pedidos atualmente abertos está em menos. Aqui está a função reescrita que deve definir as bandeiras curta e longa como falsas, ou seja, proibir a abertura de uma posição se houver menos ordens:

A função de chamada é esta:

Talvez as condições para o bey sejam mais adequadas? É verdade, só vendi hoje devido a uma queda muito fraca do euro, mas mesmo assim, algo é melhor do que nada!
 
borilunad:
Talvez as condições sejam mais adequadas para a bai? Francamente falando, apenas as vendas são abertas hoje por causa do declínio muito fraco do euro, mas de qualquer forma algo é melhor do que nada!


Não. O sinal está escrito em int GetGeneralSignal() e funciona claramente. O sinal é primitivo, eu o levei apenas para o teste. Se a PCI cruzou a borda superior - comprar, e se a inferior - vender. Eu mesmo não uso índices, mas decidi verificar isto apenas para uma experiência.

Então, aí está. Sem bandeiras, tudo funciona perfeitamente. Mas não é assim com as bandeiras. Quando a funçãoint FindOrders(bool&longo,bool&curto) contém uma ordem do tipo dado e seu lucro está abaixo de zero, minha função, de acordo com a referência à função GetGeneralSignal(), deve passar um valor falso para uma determinada bandeira, mas na verdade as bandeiras sempre se mostram verdadeiras:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         long = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}  

Posso vê-la na impressora, mas não está claro porque a bandeira não muda.

A propósito, eu mostrei a rentabilidade dos pedidos na impressão:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     pr("profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     pr("profitS =" + profitS);
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

E na impressão o valor das bandeiras, é isto que é mostrado:

Ou seja, é claro que quando a rentabilidade está abaixo de zero, a bandeira correspondente deve ser colocada em falso, mas isso não acontece... Tudo parece ser elementar, mas algo não está acontecendo.

 
hoz:


Não. Há um sinal na função GetGeneralSignal() que funciona bem. O sinal é primitivo, eu o levei apenas para o teste. Se a PCI cruzou a borda superior - comprar, e se a inferior - vender. Eu mesmo não uso índices, mas decidi verificar isto apenas para uma experiência.

Então, aí está. Sem bandeiras, tudo funciona perfeitamente. Mas não é assim com as bandeiras. Quando a funçãoint FindOrders(bool&longo,bool&curto) contém uma ordem do tipo dado e seu lucro está abaixo de zero, minha função, de acordo com a referência à função GetGeneralSignal(), deve passar um valor falso para uma determinada bandeira, mas as bandeiras sempre contêm a verdade:

Eu vejo isso na impressão, mas não entendo porque a bandeira não muda.
Olhe, você escreveu long=falso em ambos os casos, então como vai abrir?
 
hoz:



Posso vê-la na impressão, mas a razão pela qual a bandeira não muda não é clara.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false; /// ?????????????????????? 
                 }
                 t++;
              }
   }
   
   return (t);
}  
 

Corrigido o erro datilográfico.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

                 else if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);
                         profitS = OrderProfit();
                         if (profitS < 0)
                         short = false;
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}

Aqui está uma captura de tela:

Você pode ver, na tabela, que a bai é minúscula e a bandeira = TRU tudo na mesma.

 
Boa noite, você poderia me dizer como fazer o formulário de alerta aparecer apenas uma vez quando a condição ocorre e não toda vez que a condição é preenchida?
 

Sinto pena de você! Escreverei como funcionará sem loops, que são retardados por funções! Aqui está seu código, mas em que eu o transformo!

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long, bool& short)
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
Este esquema é livre de cãibras e funciona instantaneamente! Acabar com funções desnecessárias! Você pode encontrar a função ExistPositions() em Funções Úteis do Querido Kim!
 
borilunad:

Sinto pena de você! Escreverei como funcionará sem loops, que são retardados por funções! Aqui está seu código, mas em que eu o transformo!

Este esquema é fácil e funciona instantaneamente! Acabar com funções desnecessárias! Você pode encontrar a função ExistPositions() em Funções Úteis de Kim!


Boris, a funçãoExistPositions temo mesmo laço, só que tem mais verificações desnecessárias, de modo que não será lento no caminho. Sua lógica é clara para mim, mas o motivo da inoperabilidade da versão anterior não foi revelado, o que é estranho :)

Você também usa estas bandeiras:

 if(profitL > 0 && long == true && short == false)

E eu estava demonstrando que eles não retornam corretamente.

Portanto, novamente, se as variáveis profitL e profitS estiverem presentes nesta função, então as bandeiras não são necessárias.

Foi assim que aconteceu:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(double& profitL, double& profitS)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)              // Найден ордер типа OP_BUY
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30)
       return (SIGNAL_NO);

   if(ExistPositions() == false)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
      {
         if (GetRSI(0) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI(1) > i_RSIToDnLimit)
       {
         if (GetRSI(0) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

Mais uma vez, não está abrindo no sinal, está abrindo em qualquer coisa.

 
Olá a todos!
Estou fazendo uma trilha virtual e encontrei um problema com closelevel=profitpips-TrailingStop que é trawl e GlobalVariableSet("tral",0) é ligado como deveria ser, mas variável
variável denível próximo é atribuído o valor de profitpips(é o lucro atual em pips) em vez de profitpips-TrailingStop, com todas as conseqüências daí decorrentes o_o



void Trailing()
   {
    if(!GlobalVariableCheck("tral")&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
      GlobalVariableSet("tral",0);
      }
    if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
    if(GlobalVariableCheck("tral")&&profitpips<=closelevel)
     {
      Print ("ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ");
      for (int i=0; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return;}

Eu descobri, a linha
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


mudou-o para...
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



Agorao nível próximonão é modificadoquando o lucro aumenta...

Eu já descobri isso.



 
hoz:


Boris, a funçãoExistPositions tem o mesmolaço, mas há mais verificações desnecessárias, de modo que não será lento ao longo do caminho. Sua lógica é clara para mim, mas o motivo da inoperabilidade da versão anterior não foi revelado, o que é estranho :)

Você também está usando estas bandeiras:

E demonstrei que eles não são devolvidos corretamente.

Portanto, novamente, se as variáveis profitL e profitS estiverem presentes nesta função, então as bandeiras não são necessárias.

Foi assim que tudo funcionou:

Mais uma vez ela se abre não por sinal, mas por qualquer coisa.

Então faça algumas escavações em seu próprio lugar! Você tem uma função para cada palavra de seu código, e você tem que se contentar com variáveis. Isso é o que torna o código pesado. Você deve usar funções quando não pode passar sem elas! Eu comentei tudo no código de Kim que eu não preciso, e tudo funciona muito rápido! Lembre-se, eu perguntei a todos como fazer o programa funcionar mais rápido sob muitas condições. Agora os testes funcionam por um ano em todos os carrapatos em 5 minutos! Passei a pente fino todas as condições e funções e joguei fora tudo o que era desnecessário.
Razão: