[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 334

 
hoz:


 Борис, если закоментировать одно из условий в функции int GetGeneralSignal(), открытие чёткое.

Я отследил. Флаг не изменяет своё значение, когда профитность текущих открытых ордеров в минусе. Вот переписанная функция, которая должно перевести значение флагов short и long в false т.е. запрет на открытие позиции если есть минусовые ордера:

 Вызывающая функция вот:

 

Может условия для бая более подходящие? Правда, сегодня у меня только селлы открываются ввиду понижения евро очень слабого, но всё-таки что-то лучше, чем ничего!
 
borilunad:
Может условия для бая более подходящие? Правда, сегодня у меня только селлы открываются ввиду понижения евро очень слабого, но всё-таки что-то лучше, чем ничего!


 Нет. Там же в функции int GetGeneralSignal() прописан сигнал, который работает чётко. Сигнал примитивный, я его взял просто для теста. Если РСИ пересёк верхнюю границу - бай, а если нижнюю - селл. Сам я индюками не пользуюсь, а это чисто для эксперимента я проверить решил.

 Так вот. Без флагов, всё работает идеально. А с флагами не так. Ведь когда в функции int FindOrders(boollongboolshortнаходится  ордер заданного типа, и его профит ниже нуля, судя по моей функции, по ссылке в функцию GetGeneralSignal() должно передаться для канкретного из флагов значение false, а по факту значение флагов постоянно в true :

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
}  

Я это вижу в принте, но почему не изменяется флаг не понятно.

Кстати, я вывел на принт профитность ордеров:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
}

 А в принте значение флагов, вот что показывается:

 

 Т.е. ясно видно, что когда профитность меньше нуля, то должен соответствующий флаг переводится с false , но этого не происходит... Вроде всё элементарно, но что-то не идёт.

 
hoz:


 Нет. Там же в функции int GetGeneralSignal() прописан сигнал, который работает чётко. Сигнал примитивный, я его взял просто для теста. Если РСИ пересёк верхнюю границу - бай, а если нижнюю - селл. Сам я индюками не пользуюсь, а это чисто для эксперимента я проверить решил.

 Так вот. Без флагов, всё работает идеально. А с флагами не так. Ведь когда в функции int FindOrders(boollongboolshortнаходится  ордер заданного типа, и его профит ниже нуля, судя по моей функции, по ссылке в функцию GetGeneralSignal() должно передаться для канкретного из флагов значение false, а по факту значение флагов постоянно в true :

Я это вижу в принте, но почему не изменяется флаг не понятно.
Посмотри, ты в том и другом случае написал лонг=фалсе, так как же он у тебя откроется?!
 
hoz:



Я это вижу в принте, но почему не изменяется флаг не понятно.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
}  
 

Исправил описку.

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
}

 Вот скрин:

 

 Видно, на графике коменты, что баи с минусом, а флаг = ТРУ всё-равно.

 
Добрый вечер, подскажите пожалуйста, как сделать так, что бы форма Alert`а появлялась только один раз при наступлении условия, а не каждый раз когда условие выполняется?
 

Мне тебе жалко стало! Сейчас тебе напишу, как будет работать и без циклов, которые тормозятся функциями! Вот твой код, но во что его переделаю!

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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.........................)
   }  }
      


                     
Эта схема без заморочек и работает моментально! Откажись от лишних функций! Функцию ExistPositions() найдёшь в Полезных функциях Уважаемого Кима!
 
borilunad:

Мне тебе жалко стало! Сейчас тебе напишу, как будет работать и без циклов, которые тормозятся функциями! Вот твой код, но во что его переделаю!

Эта схема без заморочек и работает моментально! Откажись от лишних функций! Функцию ExistPositions() найдёшь в Полезных функциях Уважаемого Кима!


Борис, в функции ExistPositions тот же цикл, только там больше проверок лишних, так что тормознутости не будет по ходу. Ваша логика мне понятна, только вот причина нерабочести прошлого варианта осталась не раскрыта, что есть странно :)

У вас же тоже используются данные флаги:

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

 А я демонстрировал, что они не верно возвращаются.

 Ну так опять же, если в данной функции будут присуствовать переменные profitL и profitS то флаги не нужны.

Вот так вышло:

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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);
}

 

 Опять же открывается не по сигналу, а абы-как.

 
Всем привет!
Помогите советом, делаю виртуальный трал и столкнулся с такой проблемой: почему то не срабатывает строка closelevel=profitpips-TrailingStop, т.е. трал и GlobalVariableSet("tral",0) включается как положено, но переменной
closelevel присваивается значение profitpips (это текущий профит в пунктах), а не profitpips-TrailingStop со всеми вытекающими последствиями 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;}

 

Разобрался с этим, строку 
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


изменил на
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



ток теперь при увеличении профита closelevel не модифицируется... 

 

всё уже разобрался. 



 
hoz:


Борис, в функции ExistPositions тот же цикл, только там больше проверок лишних, так что тормознутости не будет по ходу. Ваша логика мне понятна, только вот причина нерабочести прошлого варианта осталась не раскрыта, что есть странно :)

У вас же тоже используются данные флаги:

 А я демонстрировал, что они не верно возвращаются.

 Ну так опять же, если в данной функции будут присуствовать переменные profitL и profitS то флаги не нужны.

Вот так вышло:

 Опять же открывается не по сигналу, а абы-как.

Значит копай у себя! У тебя каждое слово кода функция, а надо обходится переменными. Вот и получается код тяжёлый. Функциями надо пользоваться, когда без них никак нельзя обойтись! У Кима я закомментировал всё, что мне не нужно, и всё работает очень быстро! Помнишь, я у всех спрашивал, как сделать, чтобы при многих условиях программа работала быстрее. Сейчас тестирование проходит за год на всех тиках за 5 минут! Прочесал все условия и функции, выкинул всё ненужное.
Причина обращения: