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

asdqwe

Активный участник
Добрый день.
Есть индикатор, который в режиме реального времени отрисовывается не совсем корректно, но при обновлении графика или при переключение туда=сюда таймфреймов он рисуется как надо.

Я пробовал функции ChartRedraw, WindowRedraw и переключение периодов ChartSetSymbolPeriod. Первые две вообще не работают(не перерисовывают индикатор)

ChartSetSymbolPeriod работает, но при установке вместе с советником при каждом обновлении терминал зависает секунд на 20-30 и при этом удаляет кнопки которые рисует советник(управление покупкой\продажей).

Как заставить перерисовываться индикатор и при этом сохранить работу советника?
 

Ugar

Гуру форума
Добрый день.
Есть индикатор, который в режиме реального времени отрисовывается не совсем корректно, но при обновлении графика или при переключение туда=сюда таймфреймов он рисуется как надо.

Я пробовал функции ChartRedraw, WindowRedraw и переключение периодов ChartSetSymbolPeriod. Первые две вообще не работают(не перерисовывают индикатор)

ChartSetSymbolPeriod работает, но при установке вместе с советником при каждом обновлении терминал зависает секунд на 20-30 и при этом удаляет кнопки которые рисует советник(управление покупкой\продажей).

Как заставить перерисовываться индикатор и при этом сохранить работу советника?
Некорректно мучить терминал и советник из за кривого индикатора. Правильнее рихтовать кривой индикатор.
 

star603

Новичок форума
Бросается в глаза дурной тон все переменные делать глобальными. Из за этой привычки будет много косяков.
Допустим ордер Buy и MarketInfo(_Symbol,MODE_SWAPLONG) < 0, что должна возвращать функция и от куда это значение берётся?
Допустим Sell MarketInfo(_Symbol,MODE_SWAPSHORT) < 0, что должна возвращать функция и от куда это берётся?
А это ещё зачем Lot=Lot; ? Зачем переменной присваивать её же значение?
Код:
double fl(double Tlot, int M, double Flot)//Лот по арифметической прогрессии прогрессии
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начало перебора ордеров
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==M && OrderSymbol()==_Symbol)//Выбираем ордер
        {
//*********************************************************************************************       
         Tlot = OrderLots();//Текущий лот
         if(OrderProfit()+OrderCommission()+OrderSwap()<0)//Нужное условие
            Flot = Tlot-0.01;//Новый лот уменьшение
         else if(OrderProfit()+OrderCommission()+OrderSwap()>0)//Нужное условие
            Flot = Tlot+0.01;//Новый лот
//*********************************************************************************************
        }
     }
   return(Flot);//Финальный лот
  }

Как такой способ реализации?
 

Ugar

Гуру форума
Код:
double fl(double Tlot, int M, double Flot)//Лот по арифметической прогрессии прогрессии
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начало перебора ордеров
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==M && OrderSymbol()==_Symbol)//Выбираем ордер
        {
//*********************************************************************************************      
         Tlot = OrderLots();//Текущий лот
         if(OrderProfit()+OrderCommission()+OrderSwap()<0)//Нужное условие
            Flot = Tlot-0.01;//Новый лот уменьшение
         else if(OrderProfit()+OrderCommission()+OrderSwap()>0)//Нужное условие
            Flot = Tlot+0.01;//Новый лот
//*********************************************************************************************
        }
     }
   return(Flot);//Финальный лот
  }

Как такой способ реализации?
А если
OrderProfit()+OrderCommission()+OrderSwap() окажется = 0, каким будет значение Flot ?
Если оно не назначено вне функции, будет ошибка. Так как в функции в этой ситуации значение не присваивается.
 

griz

Активный участник
Здравствуйте. При клике на объект, как вызвать цветовую палитру для выбора цвета?
 

Вложения

  • color.png
    color.png
    30 КБ · Просмотры: 10

star603

Новичок форума
А если
OrderProfit()+OrderCommission()+OrderSwap() окажется = 0, каким будет значение Flot ?
Если оно не назначено вне функции, будет ошибка. Так как в функции в этой ситуации значение не присваивается.
Код:
         else if(OrderProfit()+OrderCommission()+OrderSwap()==0)//Нужное условие
            Flot = 0.01;//Новый лот
Так сделаю
 

star603

Новичок форума
Код:
void OnTick()
  {
   sw();
  }
//---------------------------------------------------------------------------------------- 
int sw(int P)
  {
//*************************************************************************
   switch(TORGISW)
     {
      case 0:
         if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0)
            P=0;
         break;
      case 1:
         if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0)
            P=1;
         break;
      case 2:
         if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0)
            P=2;
         else
            if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0)
               P=2;
         break;
     }
//*************************************************************************
   return(P);
  }

Почему выдает :
'sw' - wrong parameters count
 

AlexeyVik

Программист mql4 mql5
Код:
void OnTick()
  {
   sw();
  }
//----------------------------------------------------------------------------------------
int sw(int P)
  {
//*************************************************************************
   switch(TORGISW)
     {
      case 0:
         if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0)
            P=0;
         break;
      case 1:
         if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0)
            P=1;
         break;
      case 2:
         if(MarketInfo(Symbol(),MODE_SWAPLONG)<0 && MarketInfo(Symbol(),MODE_SWAPSHORT)<0)
            P=2;
         else
            if(MarketInfo(Symbol(),MODE_SWAPLONG)>0 && MarketInfo(Symbol(),MODE_SWAPSHORT)>0)
               P=2;
         break;
     }
//*************************************************************************
   return(P);
  }

Почему выдает :
'sw' - wrong parameters count
Напиши так
Код:
int sw(int P = 0)
или так
Код:
 sw(0);
 

Ugar

Гуру форума
Код:
         else if(OrderProfit()+OrderCommission()+OrderSwap()==0)//Нужное условие
            Flot = 0.01;//Новый лот
Так сделаю
1. Функция это код который требует для выполнения работу процессора. Обращение к переменной гораздо быстрее.
2. Не учтены возможные погрешности вычисления и хранения дробных значений (double).

Так будет лучше
Код:
double Profit=OrderProfit()+OrderCommission()+OrderSwap();

if(Profit>0,00001)Flot = Tlot+0.01;

else if(Profit< -0,00001)Flot = Tlot-0.01;

else Flot = 0.01;
 

ZenFX

Почетный гражданин
Код:
double fl(double Tlot, int M, double Flot)//Лот по арифметической прогрессии прогрессии
  {
   for(int y=0; y<= OrdersHistoryTotal()-1; y++)//Начало перебора ордеров
     {
      if(OrderSelect(y, SELECT_BY_POS,MODE_HISTORY)==true && OrderMagicNumber()==M && OrderSymbol()==_Symbol)//Выбираем ордер
        {
//*********************************************************************************************    
         Tlot = OrderLots();//Текущий лот
         if(OrderProfit()+OrderCommission()+OrderSwap()<0)//Нужное условие
            Flot = Tlot-0.01;//Новый лот уменьшение
         else if(OrderProfit()+OrderCommission()+OrderSwap()>0)//Нужное условие
            Flot = Tlot+0.01;//Новый лот
//*********************************************************************************************
        }
     }
   return(Flot);//Финальный лот
  }

Как такой способ реализации?
ВСЁ НЕ ПРАВИЛЬНО )).
Зачем перебирать все ордера в истории, чтобы на выходе получить НОВЫЙ ЛОТ ). Зачем в функцию передавать параметры Tlot и Flot ??? Нет, это так всё не работает, мой совет читать ХЕЛП по MQL4 прям прям с самой первой строчки самого первого раздела, там вкратце написано более менее всё понятно. ))) Разобраться в том как всё работает для начала, потом уже писать и спрашивать, так не так... НУ тип того ).
 

star603

Новичок форума
ВСЁ НЕ ПРАВИЛЬНО )).
Зачем перебирать все ордера в истории, чтобы на выходе получить НОВЫЙ ЛОТ ). Зачем в функцию передавать параметры Tlot и Flot ??? Нет, это так всё не работает, мой совет читать ХЕЛП по MQL4 прям прям с самой первой строчки самого первого раздела, там вкратце написано более менее всё понятно. ))) Разобраться в том как всё работает для начала, потом уже писать и спрашивать, так не так... НУ тип того ).
1) Затем чтобы если прошлая сделка с прибылью то новый лот увеличенный.
2) Я пробовал глобально объявлять но мне сказали это правило дурного тона.
3) Ну подскажи как это работает или приведи пример кода на основе идеи.
4) У меня есть рабочие варианты ,которые работают ,но мне сказали так не правильно писать и код будет тормозить.
 

ZenFX

Почетный гражданин
1) Затем чтобы если прошлая сделка с прибылью то новый лот увеличенный.
2) Я пробовал глобально объявлять но мне сказали это правило дурного тона.
3) Ну подскажи как это работает или приведи пример кода на основе идеи.
4) У меня есть рабочие варианты ,которые работают ,но мне сказали так не правильно писать и код будет тормозить.

Ну перебирать чтобы найти СВОЙ, ладно это я понял ). Ну примерно так вот.

Код:
double lot(string symbol, int magic, double lotAdds)
{
  double result = 0;
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      if ((OrderMagicNumber() == magic) && (OrderSymbol() == symbol) && (OrderLots() != 0))
      {
        result = (OrderProfit() + OrderCommission() + OrderSwap() > 0) ? OrderLots() + lotAdds : OrderLots() - lotAdds;
        break;
      }
    }
    else
      Print("Ошибка : ", GetLastError());      
  }  
  return(NormalizeDouble(result, 2));
}
 

star603

Новичок форума
Ну перебирать чтобы найти СВОЙ, ладно это я понял ). Ну примерно так вот.

Код:
double lot(string symbol, int magic, double lotAdds)
{
  double result = 0;
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {
      if ((OrderMagicNumber() == magic) && (OrderSymbol() == symbol) && (OrderLots() != 0))
      {
        result = (OrderProfit() + OrderCommission() + OrderSwap() > 0) ? OrderLots() + lotAdds : OrderLots() - lotAdds;
        break;
      }
    }
    else
      Print("Ошибка : ", GetLastError());     
  } 
  return(NormalizeDouble(result, 2));
}
Всмысле свой?
 

AlexeyVik

Программист mql4 mql5
почему так? ведь там значение может быть 2 или 1? к примеру в AUDCAD должен выдать 1
Вот это
Код:
int sw(int P)
Объявление функции. Во входящие переменные вписана int P и вызывая эту функцию обязательно надо отправлять туда значение соответствующее типу той входящей переменной.
 

ZenFX

Почетный гражданин
Со своим мейджиком со своего инструмента. А OrderLots() = 0 вообще не может быть, эт вы меня тут запутали )))). Это чисто для примера... )
Ну можно так написать ), делов то. Как хошь так и пиши, только правильно ). Примерно так вот ))).
Код:
double lot(string symbol, int magic, double lotAdds)
{
  double result = 0;
  for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
  {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))
    {      
      if ((OrderMagicNumber() == magic) && (OrderSymbol() == symbol))
      {
        double profit = OrderProfit() + OrderCommission() + OrderSwap();
        if (profit != 0)
        {
          result = (profit > 0) ? OrderLots() + lotAdds : OrderLots() - lotAdds;
          break;
        }        
      }
    }
    else
      Print("Ошибка : ", GetLastError());      
  }  
  return(NormalizeDouble(result, 2));
}
 
Верх