Ваши вопросы по языку MQL4

tommy27

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



PHP:
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;}
 
Последнее редактирование модератором:

tommy27

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

ток теперь при увеличении профита
PHP:
closelevel
не модифицируется...
пятница... мозг устал... не вижу очевидных вещей... спать пойду, завтра всё сразу сделается)))
 
Последнее редактирование модератором:

ale002

::: __,,,^._.^,,,__ :::
но переменной closelevel присваивается значение profitpips(это текущий профит в пунктах), а не profitpips-TrailingStop

Это патамушта 2й if сработает обязательно, если сработал 1й. А он и присвоит closelevel=profitpips. И 3й if тоже сработает, если 1й сработал. Где-то у вас else не хватает, не оч понимаю логику, поэтому не скажу где именно. Скорей всего перед 2м и 3м if'ами
 

tommy27

Гуру форума
Сладкий кофе с печеньками, помогли, разобрался, спасибо, обошлось без else.
 
Последнее редактирование:

qqmber

Почетный гражданин
Флаг "железно" в ТРУ постоянно (на скрине ТП баев минусовый, а флаг в ТРУ):

Правильно, потому что if (profitL < OrderProfit()) выполняется только для позиций с положительным профитом. Я вообще не понимаю, что этот if тут делает, по-моему, с логикой непорядок, предыдущая версия этой функции выглядела разумнее.
 

hoz

Активный участник
Правильно, потому что if (profitL < OrderProfit()) выполняется только для позиций с положительным профитом. Я вообще не понимаю, что этот if тут делает, по-моему, с логикой непорядок, предыдущая версия этой функции выглядела разумнее.

Да там уже решился вопрос. Логика была не верная. Вот так вот я реализовал для покупок:

PHP:
if (OrderType() == OP_BUY)              // Найден ордер типа OP_BUY
                 {
                     if (profitL > OrderProfit())
                     {
                         profitL = OrderProfit();
                         Print("i = ", i, " ; profitL = ", profitL);
        //                 pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
 
Последнее редактирование модератором:

hoz

Активный участник
Возник новый головняк. Есть пачки отложек в разные стороны. Рассмотрим один из вариантов:

Если отложка на бай сработала, значит нам нужно удалить одну крайнюю отложку селовую, т.е. с самой низкой ценой. Выкладываю свой код, который удаляет почему то сразу все селовые отложки:

PHP:
//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
          Print("DeletePendingSells: s_ticket = ", s_ticket);
          Print("DeletePendingSells: OOP = ", OOP);
      }
   }

   while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }
   
   return (0);
  //Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}


Логику кода по строкам я специально прописал в комментариях, чтоб все поняли что я писал.
Логика то вроде простая, но работает не верно. Что не так? Может кто-н. подобное уже писал и есть на что взглянуть?
 
Последнее редактирование модератором:

AlexeyVik

Программист mql4 mql5
Возник новый головняк. Есть пачки отложек в разные стороны. Рассмотрим один из вариантов:

Если отложка на бай сработала, значит нам нужно удалить одну крайнюю отложку селовую, т.е. с самой низкой ценой. Выкладываю свой код, который удаляет почему то сразу все селовые отложки:

PHP:
//+-------------------------------------------------------------------------------------+
//| Удаление несработанных отложеннык шортов                                            |
//+-------------------------------------------------------------------------------------+
void DeletePendingSells(int& amountOfCurrPending)
{
   int total = OrdersTotal() - 1,
       ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить
       s_ticket;
   amountOfCurrPendingBuys = 0;                       // Количество текущих отложек на покупку
   amountOfCurrPendingSells = 0;                      // Количество текущих отложек на продажу
   Print("ordersToDelete = level - amountOfCurrPending ; ", level, " - ", amountOfCurrPending);

   double OOP = 20.0;                                  // Зададим значение цены открытия отложки, которой не может быть..
   
   if (ordersToDelete == 0) return (0);

   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS)) continue;
      if (OrderSymbol() != Symbol()) continue;
      if (OrderMagicNumber() != i_magic) continue;
      if(OrderType() != OP_SELLSTOP) continue;         // Работает только с шортовыми ордерами
      
      if (OOP > OrderOpenPrice())
      {
          Print("OOP > OrderOpenPrice() ; ", OOP, " > ", OrderOpenPrice());
          OOP = OrderOpenPrice();                  // Ищется ордер, с минимальной ценой открытия
          s_ticket = OrderTicket();                // Получаем тикет ордера с минимальной ценой открытия
          Print("DeletePendingSells: s_ticket = ", s_ticket);
          Print("DeletePendingSells: OOP = ", OOP);
      }
   }

   while (ordersToDelete > 0)                      // Если есть ордера, которые требуется удалить..
   {
      OrderDelete(s_ticket,Black);
      ordersToDelete--;                        // Уменьшаем количество требуемых ордеров для удаления на 1, т.к. строкой выше..
                                               // .. один отложенник уже удалили
   }
   
   return (0);
  //Print("DeletePendingSells: ordersToDelete = ", ordersToDelete);
}


Логику кода по строкам я специально прописал в комментариях, чтоб все поняли что я писал.
Логика то вроде простая, но работает не верно. Что не так? Может кто-н. подобное уже писал и есть на что взглянуть?
Так если тебе надо удалить только один ордер, зачем-же удаление поставил в цикл wile()
 

hoz

Активный участник
Так если тебе надо удалить только один ордер, зачем-же удаление поставил в цикл wile()

На случай, если сработает больше 1 отложки в бай, и нужно будет закрыть больше 1 отложки в селл.
Через параметр amountOfCurrPending переддаётся количество отложек. А значит если их количество меньше требуемого, то мы имеет разницу. Понимаете?
Вот:

PHP:
ordersToDelete = level - amountOfCurrPending,  // Количество отложек, которые требуется удалить


Значит нужно удалить ordersToDelete отложек.
 

Schielend

Прохожий
Проверить условие

Помогите если не сложно написать две строчки кода для считывания цвета линии индикатора SMA centered oscillator 2.02 и проверки условия - если линия синяя (индекс линии 1) покупаем.
Нужно для теста стратегии на истории.
Индикатор прилагаю.
 

Вложения

  • SMA centered oscillator 2.02.mq4
    4,4 КБ · Просмотры: 20

Ugar

Гуру форума
Помогите если не сложно написать две строчки кода для считывания цвета линии индикатора SMA centered oscillator 2.02 и проверки условия - если линия синяя (индекс линии 1) покупаем.
Нужно для теста стратегии на истории.
Индикатор прилагаю.
Синяя линия есть всегда. Белая иногда закрывает синюю. Сделай белую линию тонкой или бесцветной и увидишь что она на фоне синей.
Так что условие, если линия синяя - покупать, неверно. Получится что покупать всегда. Нужно оперировать с белой линией или с наклоном синей.
 

Schielend

Прохожий
Спасибо, с линией разобрался.
Еще вопрос, как заполнить массив даных последних N баров значений стохастика?
Т.е. допустим период стохастика 14 баров, а мне нужно узнать числовые значение последних 4-х баров, чтобы сравнить их между собой и определить тенденцию.
 

krovel

Прохожий
Извиняюсь за глупый вопрос,как можно присвоить значение переменной <x>:
if ( uy != false)
{
double x = Bid+0.0002+otstup*Point;
}
else
{

double x = Ask+30*Point;
{
такой вариант не работает ,как можно это организовать?
 

Ugar

Гуру форума
Извиняюсь за глупый вопрос,как можно присвоить значение переменной <x>:
if ( uy != false)
{
double x = Bid+0.0002+otstup*Point;
}
else
{

double x = Ask+30*Point;
{
такой вариант не работает ,как можно это организовать?
Попробуй объявить переменную, до всех условий.
double x;
if (uy)x = Bid+0.0002+otstup*Point;
else x = Ask+30*Point;
 

Ugar

Гуру форума
Спасибо, с линией разобрался.
Еще вопрос, как заполнить массив даных последних N баров значений стохастика?
Т.е. допустим период стохастика 14 баров, а мне нужно узнать числовые значение последних 4-х баров, чтобы сравнить их между собой и определить тенденцию.
int N=10;
double Stoch[];
ArrayResize(Stoch,N);
for(int i=0; i<N; i++)Stoch= iStochastic(NULL,0,14,3,3,MODE_SMA,0,0,i);
 

krovel

Прохожий
'x' - variable already defined( уже определена переменная) такую ощибку пишет.
Ugar , я не совсем понял где предлагаешь объявить "x" ,покажи пожалуйста.


//+------------------------------------------------------------------+
//| blablabla.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
extern bool uy = true;
int start()
{
if ( uy != false)
{double x= Bid+0.0002+30*Point;

}
else
{
double x= Ask+30*Point;

}
return(0);
}
//+------------------------------------------------------------------+
 

Ugar

Гуру форума
'x' - variable already defined( уже определена переменная) такую ощибку пишет.
Ugar , я не совсем понял где предлагаешь объявить "x" ,покажи пожалуйста.


//+------------------------------------------------------------------+
//| blablabla.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""

//+------------------------------------------------------------------+
//| script program start function |
//+------------------------------------------------------------------+
extern bool uy = true;
int start()
{
if ( uy != false)
{double x= Bid+0.0002+30*Point;

}
else
{
double x= Ask+30*Point;

}
return(0);
}
//+------------------------------------------------------------------+
До всех условий. А после условий брать double перед х
extern bool uy = true;
int start()
{
double x;
if ( uy != false)
{x= Bid+0.0002+30*Point;

}
else
{
x= Ask+30*Point;

}
return(0);
}
 
Последнее редактирование:

Schielend

Прохожий
Спасибо за помощь. Теперь возник вопрос, как проверить упорядочены ли числа в массиве или нет?
Сам смог сделать проверку только без массива, чтобы протестировать стратегию
// Покупка
/*
if (stochF1>stochF2 && stochF2>stochF3 && stochF3>stochF4 && stochF4>stochF5 && stochF<Level_UPF)
{
r=2;
}
// Продажа
if (stochF1<stochF2 && stochF2<stochF3 && stochF3<stochF4 && stochF4<stochF5 && stochF>Level_DOWNF)
{
r=1;
}*/
Но хотелось бы все таки массивом, чтобы при изменении N не переписывать часть программы.
На ум приходит только присвоение произвольной переменной какого-нибудь значения (например 2 для покупки и 1 для продажи) и затем суммирования их внутри цикла и сравнение с требуемым значением в зависимости от количества баров N, но такой вариант будет плохим.
 
Верх