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

kudinoff

Почетный гражданин
Подскажите, есть ли способ стабилизации значений индикатора возле нулевой отметки, чтобы поменьше шумело?
1652976057003.png
 

vladradon

Программист
Подскажите, есть ли способ стабилизации значений индикатора возле нулевой отметки, чтобы поменьше шумело?
Посмотреть вложение 474479
Можно ввести ограничение по минимальному значению гисто - меньше порогового, значит 0. Порог вывести в настройки для универсальности.
 

vitto.mq4

Местный знаток
Вставь в функцию OnInit строку:
int OnInit()
{
if(AccountNumber()!=123456789) {Print("Wrong account!"); return(INIT_FAILED);}

где 123456789 - это номер счета для привязки - вводишь нужный.
Уважаемый выручите еще раз🙏
Подскажите что надо исправить советник выдает ошибку OrderSend error 131

Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
if (Lot<MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);
 

egor008

Активный участник
error 131. Это неправильный объём лота. Какие у вас значения "Risk" и "D" Проверьте их. А так же: "AccountBalance()"
Эти, основные три значения, влияют на расчёт лота.
А так же, если вы на выходные, гоняли его в тестере. То лот, типа 0.01. может дать ошибку. Меняйте его на 0.1 в тестере на выходных.
Вроде бы всё, что знаю..
Так. Ошибки нет.
Проверяйте.
PHP:
   //+------------------------------------------------------------------------------------------------------------------+//        
           
    double Risk = 4.6;  
      
    double D = 4.7;   

     double   Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);

      if (Lot > MarketInfo(Symbol(),MODE_MAXLOT))Lot=MarketInfo(Symbol(),MODE_MAXLOT);  
      if (Lot < MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);     
           
            
     Comment("\n"
     
      "Balance  " ,AccountBalance() , "\n"
      "Risk  " ,Risk , "\n"
      "Lot  " ,Lot , "\n"
      "D  " ,D , "\n"
      );

      if( OrdersTotal()==0 && Volume[0] > 5){
      
         int tic = OrderSend(Symbol(),OP_BUY,Lot,Ask,5,0,0,"",55555,0,clrBlue);
      }
      // Если Balance 10000
      // Итоговый Лот = 0.98 
      //+------------------------------------------------------------------------------------------------------------------+//
 

vitto.mq4

Местный знаток
error 131. Это неправильный объём лота. Какие у вас значения "Risk" и "D" Проверьте их. А так же: "AccountBalance()"
Эти, основные три значения, влияют на расчёт лота.
А так же, если вы на выходные, гоняли его в тестере. То лот, типа 0.01. может дать ошибку. Меняйте его на 0.1 в тестере на выходных.
Вроде бы всё, что знаю..
Так. Ошибки нет.
Проверяйте.
PHP:
   //+------------------------------------------------------------------------------------------------------------------+//     
        
    double Risk = 4.6;
   
    double D = 4.7;

     double   Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);

      if (Lot > MarketInfo(Symbol(),MODE_MAXLOT))Lot=MarketInfo(Symbol(),MODE_MAXLOT);
      if (Lot < MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);  
        
         
     Comment("\n"
  
      "Balance  " ,AccountBalance() , "\n"
      "Risk  " ,Risk , "\n"
      "Lot  " ,Lot , "\n"
      "D  " ,D , "\n"
      );

      if( OrdersTotal()==0 && Volume[0] > 5){
   
         int tic = OrderSend(Symbol(),OP_BUY,Lot,Ask,5,0,0,"",55555,0,clrBlue);
      }
      // Если Balance 10000
      // Итоговый Лот = 0.98
      //+------------------------------------------------------------------------------------------------------------------+//
Спасибо за помощь, но все так же не проходит валидацию...

test on EURUSD,H1
2020.04.01 00:00:09 FX_AX EURUSD,H1: OrderSend error 131
 
Последнее редактирование модератором:

Fillelin

Элитный участник
Уважаемый выручите еще раз🙏
Подскажите что надо исправить советник выдает ошибку OrderSend error 131

Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
if (Lot<MarketInfo(Symbol(),MODE_MINLOT))Lot=MarketInfo(Symbol(),MODE_MINLOT);
Код:
bool CheckMoneyForTrade(string symb, double lots, int type)
{
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   if(free_margin<0)
   {
      string oper =(type==OP_BUY)?"Buy":"Sell";
      Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
      return(false);
   }
   return(true);
}
 

vitto.mq4

Местный знаток
Код:
bool CheckMoneyForTrade(string symb, double lots, int type)
{
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   if(free_margin<0)
   {
      string oper =(type==OP_BUY)?"Buy":"Sell";
      Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
      return(false);
   }
   return(true);
}
Я в программирование полный ноль...
Подскажите это вставить вместо моего кода ?
Или ?
 

vitto.mq4

Местный знаток
Извините, если вы "полный ноль", то я и не знаю тогда, как объяснить...
Я не прошу объяснять, я прошу исправить или заменить код, чтоб убрать ошибки
Готов отблагодарить за помощь
 
Последнее редактирование:

Ugar

Гуру форума
Я в программирование полный ноль...
Подскажите это вставить вместо моего кода ?
Или ?
Эта функция проверяет достаточно ли средств для открытия позиции и не имеет отношения к 131 ошибке. Не стоит вместо неё что то вставлять. Её можно не вызывать, то тогда если не хватит денег вылезет ошибка при открытии позиции.
Там же написано что функция OrderSend выдаёт эту ошибку. Значит ей лот кривой достаётся. Рихтовать надо.
 

vitto.mq4

Местный знаток
Эта функция проверяет достаточно ли средств для открытия позиции и не имеет отношения к 131 ошибке. Не стоит вместо неё что то вставлять. Её можно не вызывать, то тогда если не хватит денег вылезет ошибка при открытии позиции.
Там же написано что функция OrderSend выдаёт эту ошибку. Значит ей лот кривой достаётся. Рихтовать надо.
Сделал так:
Lot=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(Symbol(),MODE_TICKVALUE)*100*D),2);
if(Lot<MarketInfo(Symbol(),MODE_MINLOT)) {Lot=MarketInfo(Symbol(),MODE_MINLOT);}
if(Lot>=MarketInfo(Symbol(),MODE_MAXLOT)) {Lot=MarketInfo(Symbol(),MODE_MAXLOT);}

if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.01) dig =2;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==0.10) dig =1;
if(MarketInfo(Symbol(),MODE_LOTSTEP)==1.00) dig =0;


Теперь выдает такую ошибку:

test on EURUSD,H1
there are no trading operations
test on NZDUSD,H1
2020.02.07 18:36:25 Tester: not enough money for sell 0.20 NZDUSD at 0.64015 sl: 0.00000 tp: 0.00000 [2020.02.07 18:36]
2020.02.07 18:36:25 Tester: PrevBalance: 1.00, PrevPL: 0.00, PrevEquity 1.00, PrevMargin: 0.00, NewMargin: 128, FreeMargin: -127.04
2020.02.07 18:36:25 FINE_GOLD__1 NZDUSD,H1: OrderSend error 134
2020.02.07 18:36:35 Tester: not enough money for sell 0.20 NZDUSD at 0.64015 sl: 0.00000 tp: 0.00000 [2020.02.07 18:36]

Можете помочь убрать ошибки ?
 

Fillelin

Элитный участник
Эта функция проверяет достаточно ли средств для открытия позиции и не имеет отношения к 131 ошибке. Не стоит вместо неё что то вставлять. Её можно не вызывать, то тогда если не хватит денег вылезет ошибка при открытии позиции.
Там же написано что функция OrderSend выдаёт эту ошибку. Значит ей лот кривой достаётся. Рихтовать надо.
Вы авторитетно это утверждаете ?)
 

Fillelin

Элитный участник
Полная конструкция...)

Код:
extern double FixedLots = 0.01;  // Lot Size:

//—————————————————————————————————————————————————————|

double NormalizeLots(double lot)
{
   double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double lots = NormalizeDouble(lot/lotstep,0)*lotstep;  
   lots = fmax(lots,MarketInfo(Symbol(),MODE_MINLOT));
   lots = fmin(lots,MarketInfo(Symbol(),MODE_MAXLOT));  
   return(lots);
}

//————————————————————————————————————————————————————————————————————|

void OnTick()
{

   double Lots = NormalizeLots(FixedLots);


   if(CheckMoneyForTrade(_Symbol,Lots,OP_BUY)&& ...условия для покупки)
   {
      // Ордер на покупку
   }


   if(CheckMoneyForTrade(_Symbol,Lots,OP_SELL)&& ...условия для продажи)
   {
      // Ордер на продажу
   }

}

//————————————————————————————————————————————————————————|

bool CheckMoneyForTrade(string symb, double lots, int type)
{
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   if(free_margin<0)
   {
      string oper =(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
      return(false);
   }
   return(true);
}
 

vitto.mq4

Местный знаток
Полная конструкция...)

Код:
extern double FixedLots = 0.01;  // Lot Size:

//—————————————————————————————————————————————————————|

double NormalizeLots(double lot)
{
   double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
   double lots = NormalizeDouble(lot/lotstep,0)*lotstep;
   lots = fmax(lots,MarketInfo(Symbol(),MODE_MINLOT));
   lots = fmin(lots,MarketInfo(Symbol(),MODE_MAXLOT));
   return(lots);
}

//————————————————————————————————————————————————————————————————————|

void OnTick()
{

   double Lots = NormalizeLots(FixedLots);


   if(CheckMoneyForTrade(_Symbol,Lots,OP_BUY)&& ...условия для покупки)
   {
      // Ордер на покупку
   }


   if(CheckMoneyForTrade(_Symbol,Lots,OP_SELL)&& ...условия для продажи)
   {
      // Ордер на продажу
   }

}

//————————————————————————————————————————————————————————|

bool CheckMoneyForTrade(string symb, double lots, int type)
{
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   if(free_margin<0)
   {
      string oper =(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
      return(false);
   }
   return(true);
}
Не компилируется, ошибки выдает
У меня в коде нет фиксированного лота
 
Последнее редактирование:

egor008

Активный участник
Мне тоже помощь нужна.
Беда с заполнением массива. Сортировка цен открытых позиций.


Нужен массив, который заполняется ценами, открываемых позиций.

С такими условиями:

1) Заполнение от нулевого индекса.
2) Заполнение ценами, от наиМеньшей цены к наиБольшей цене, из открытых позиций.



Прикрепляю тест_expert. Это то, что получилось сделать, а именно: "от наиБольшей цены к наиМеньшей - индекс от нуля"

A вот, "от наиМеньшей цены к наиБольшей - индекс от нуля", вообще ни как не делается... Прошу помощи!!!


п.с.

В 300 строке, горизонтальная линия. Визуальная Метка, для максимальной цены. если мешает, уберите.
 

Вложения

  • 4.jpg
    4.jpg
    183,5 КБ · Просмотры: 42
  • test_сортировка_массива.mq4
    21,4 КБ · Просмотры: 13
Последнее редактирование:

Fillelin

Элитный участник
Мне интересно для общего развития, как может ваш код компилироваться если у вас фикс лот,
а у меня в коде параметр риск ?
Ну тогда как-то так:
Код:
enum RiskCalc{AccountBalance,AccountEquity,AccountFreeMargin};

extern double   FixedLots      = 0.01;            // Lot Size:
extern bool     PropotinalLots = false;           // Money Management:
extern RiskCalc RiskType       = AccountBalance;  // Risk Calculate Type:
extern double   PercentLots    = 0.01;            // Risk %

double Lots,risk;
int    DigitLot=0;

//————————————————————————————————————————————————————————|

int OnInit()
{
   if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 0.01) DigitLot=2;  
   if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 0.1) DigitLot=1;  
   if(MarketInfo(Symbol(),MODE_LOTSTEP)>= 1)  DigitLot=0;

   return(INIT_SUCCEEDED);
}

//———————————————————————————————————————————————————————————|

void LotsSize()
{                                            Lots = FixedLots;
   if(RiskType == AccountEquity)            {risk = AccountEquity();}
   if(RiskType == AccountBalance)           {risk = AccountBalance();}
   if(RiskType == AccountFreeMargin)        {risk = AccountFreeMargin();}  
   if(Lots<MarketInfo(Symbol(),MODE_MINLOT)) Lots = MarketInfo(Symbol(),MODE_MINLOT);
   if(Lots>MarketInfo(Symbol(),MODE_MAXLOT)) Lots = MarketInfo(Symbol(),MODE_MAXLOT);
   if(PropotinalLots){Lots = NormalizeDouble(risk * PercentLots/100.0,  DigitLot);}
}

//————————————————————————————————————————————————————————————————————————————————|

void OnTick()
{

   LotsSize();


   if(CheckMoneyForTrade(_Symbol,Lots,OP_BUY)&& ...условия для покупки)
   {
      // Ордер на покупку
   }


   if(CheckMoneyForTrade(_Symbol,Lots,OP_SELL)&& ...условия для продажи)
   {
      // Ордер на продажу
   }

}

//————————————————————————————————————————————————————————|

bool CheckMoneyForTrade(string symb, double lots, int type)
{
   double free_margin=AccountFreeMarginCheck(symb,type,lots);

   if(free_margin<0)
   {
      string oper =(type==OP_BUY)? "Buy":"Sell";
      Print("Not enough money for ",oper," ",lots," ",symb," Error code=",GetLastError());
      return(false);
   }
   return(true);
}
 

AlexeNP

Гуру форума
Мне тоже помощь нужна.
Беда с заполнением массива. Сортировка цен открытых позиций.


Нужен массив, который заполняется ценами, открываемых позиций.

С такими условиями:

1) Заполнение от нулевого индекса.
2) Заполнение ценами, от наиМеньшей цены к наиБольшей цене, из открытых позиций.



Прикрепляю тест_expert. Это то, что получилось сделать, а именно: "от наиБольшей цены к наиМеньшей - индекс от нуля"

A вот, "от наиМеньшей цены к наиБольшей - индекс от нуля", вообще ни как не делается... Прошу помощи!!!


п.с.

В 300 строке, горизонтальная линия. Визуальная Метка, для максимальной цены. если мешает, уберите.
 

Вложения

  • test_сортировка_массива.mq4
    4,7 КБ · Просмотры: 14
Верх