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

Yurkov

Почетный гражданин
Сделал так:
void OnTick(){
Lots= AccountBalance() / 1000*LotsFor1000;
...
Лот начал пересчитываться, НО! Необходимо, чтоб советник добавлял лот на каждую 1000 единиц депозита, т.е. оставался 0.1, пока депозит не дойдет до 2000 и не реагировал на промежуточное значение ($1100,1200 и тд.)
 

ansol

Местный знаток
Сделал так:
void OnTick(){
Lots= AccountBalance() / 1000*LotsFor1000;
...
Лот начал пересчитываться, НО! Необходимо, чтоб советник добавлял лот на каждую 1000 единиц депозита, т.е. оставался 0.1, пока депозит не дойдет до 2000 и не реагировал на промежуточное значение ($1100,1200 и тд.)
Можно так:
PHP:
Lots= fmax(LotsFor1000, LotsFor1000*int(AccountBalance()/1000));
 

Milord

Местный знаток
Вопрос к профи, как написать кусок кода???

Всем привет!
у меня вопрос такой, как написать в коде переключение на 3 режима, то есть например есть в коде 3 блока вычислений, мне нужно управлять их включением переключателем в настройках, переключатель например, при К=1, работает 1 блок,но не работают 2 и 3, при К=2, работает 2 блок, но не работает 1 и 3, при К=3, работает 3 блок, а 1 и 2 не работают , подскажите понятным языком как проще такой код сделать, а то был перерыв с написанием, даж стал забывать свои коды))
просьба написать в языке старого МЕ 229 билда, а то новый еще не освоил...или хотяб билд 509)
ЗАРАНЕЕ СПАСИБО!

PHP:
extern int K=1; //принимает значения 1 или 2 или 3

int start()
  {

//----------1 блок-------------
   if(...)
    if(...)
//----------2 блок--------------
   if(...)
    if(...)
//----------3 блок--------------
    if(...)
    if(...)
 

ansol

Местный знаток
Milord
Полезно в хелпе поизучать оператор switch
Вроде как раз то, что нужно по вашей проблеме.

P.S. В старом билде он также работает
 

egorr007

Новичок форума
Всем привет!

PHP:
extern int K=1; //принимает значения 1 или 2 или 3

int start()
  {

//----------1 блок-------------
   if(...)
    if(...)
//----------2 блок--------------
   if(...)
    if(...)
//----------3 блок--------------
    if(...)
    if(...)

PHP:
extern int K=1; //принимает значения 1 или 2 или 3

int start()
  {

//----------0 блок-------------
   if(K==0){
   //тут, то что должно происходить, или ничего
          }
//----------1 блок-------------
   if(K==1){
           // то что должно происходить если  extern int K=1; 
          }
//----------2 блок--------------
   if(K==2){
    // то что должно происходить если  extern int K=2; 
     }
//----------3 блок--------------
    if(K==3){// и т.д.
    }
 

ansol

Местный знаток
И все-таки, так лучше:
PHP:
   string res="";
   int i=0;
   switch(i)
     {
      case 1:
         res=i;break;
      default:
         res="default";break;
      case 2:
         res=i;break;
      case 3:
         res=i;break;
     }
   Print(res);
/*
   Результат
   default
*/
:D
 

Lender

Активный участник
код простого индюка: при алерте текущий ТФ меняется на tf1 или tf2, в зависимости от текущего ТФ, алерт дается если на графике есть любой обект с именем "1", после чего удаляется

PHP:
enum ENUM_TIMEFRAMES2{ Period_M1 = PERIOD_M1, Period_M5 = PERIOD_M5, Period_M15 = PERIOD_M15, Period_M30 = PERIOD_M30, Period_H1 = PERIOD_H1, Period_H4 = PERIOD_H4, Period_D1 = PERIOD_D1, Period_W1 = PERIOD_W1, Period_MN = PERIOD_MN1 };
extern ENUM_TIMEFRAMES2  tf1  = Period_M15;
extern ENUM_TIMEFRAMES2  tf2  = Period_M30;


//+------------------------------------------------------------------+
//| Moving Averages Convergence/Divergence                           |
//+------------------------------------------------------------------+
int start()
{
  
   if( ObjectFind("1") != EMPTY )
   {
      DoAlert("my alert text");
      ObjectDelete("1");
   }

   
 return(0);
}

void DoAlert( string msg )
{
   if( ChartPeriod(0) == (ENUM_TIMEFRAMES)tf1 )
      ChartSetSymbolPeriod(0, Symbol(), (ENUM_TIMEFRAMES)tf2);
   else
      ChartSetSymbolPeriod(0, Symbol(), (ENUM_TIMEFRAMES)tf1);
     
  Alert(msg);
}
 

dvx

Активный участник
PHP:
for (int f=OrdersTotal()-1; f>=0; f--)
    {                                                                    
   OrderSelect(f, SELECT_BY_POS );       //выбираем ордер
   {
      if(OrderType() == OP_BUY && Magic==OrderMagicNumber() && OrderSymbol()==Symbol() )                        
{         profit = OrderProfit()+OrderSwap()+profit; 
           profit_orderov=MathMax(profit, profit2);}


Народ, помогите с кодом, нужно чтобы profit2 имел данные с предыдущего тика, то есть брался бы максимальный профит за два тика. Может через static как то сделать, сам не программист ...
 

eevviill

Заблокирован
PHP:
for (int f=OrdersTotal()-1; f>=0; f--)
    {                                                                    
   OrderSelect(f, SELECT_BY_POS );       //выбираем ордер
   {
      if(OrderType() == OP_BUY && Magic==OrderMagicNumber() && OrderSymbol()==Symbol() )                        
{         profit = OrderProfit()+OrderSwap()+profit; 
           profit_orderov=MathMax(profit, profit2);}


Народ, помогите с кодом, нужно чтобы profit2 имел данные с предыдущего тика, то есть брался бы максимальный профит за два тика. Может через static как то сделать, сам не программист ...
Объяви глобальнкю переменную профит2.
А профит ей присваивай после твоего цыкла.
 
  • Like
Реакции: dvx

old6107

Активный участник
помогите с кодом!

int i = 3;
while((UpFractal == 0 || DownFractal == 0) && i<Bars)
{
if(iFractals(Symbol(), 0, MODE_UPPER, i) != 0)
if(UpFractal == 0)
UpFractal = iFractals(Symbol(), 0, MODE_UPPER, i);
if(iFractals(Symbol(), 0, MODE_LOWER, i) != 0)
if(DownFractal == 0)
DownFractal = iFractals(Symbol(), 0, MODE_LOWER, i);
i++;
}
if(UpFractal == 0 || DownFractal == 0)
{
Print("Ошибка в истории. Не найден один из фракталов!");
return(0);
}

как найти еще и предыдущие UpFractal_1 и DownFractal_1 ????
 

eevviill

Заблокирован
int i = 3;
while((UpFractal == 0 || DownFractal == 0) && i<Bars)
{
if(iFractals(Symbol(), 0, MODE_UPPER, i) != 0)
if(UpFractal == 0)
UpFractal = iFractals(Symbol(), 0, MODE_UPPER, i);
if(iFractals(Symbol(), 0, MODE_LOWER, i) != 0)
if(DownFractal == 0)
DownFractal = iFractals(Symbol(), 0, MODE_LOWER, i);
i++;
}
if(UpFractal == 0 || DownFractal == 0)
{
Print("Ошибка в истории. Не найден один из фракталов!");
return(0);
}

как найти еще и предыдущие UpFractal_1 и DownFractal_1 ????

PHP:
double buf_frac_pricses_up[200];
uint frac_up_buf_changer=0;

for(int i=0;i<Bars-1;i++)
{
if(iFractals(Symbol(), 0, MODE_UPPER, i) != 0) 
{
buf_frac_pricses_up[frac_up_buf_changer]=iFractals(Symbol(), 0, MODE_UPPER, i);
frac_up_buf_changer++;
}
}
 

old6107

Активный участник
спасибо. но что- то сложно для меня.почему цикл с i=0 и как из буфера использовать в такой конструкции if((UpFractal_0-UpFractal_1)/Point>=L))...
(я чайник!)
 

eevviill

Заблокирован
спасибо. но что- то сложно для меня.почему цикл с i=0 и как из буфера использовать в такой конструкции if((UpFractal_0-UpFractal_1)/Point>=L))...
(я чайник!)
Ну 0 потому что текущий бар проверяем.
Буфер это как бы коробка куда что то сладываешь.
buf_frac_pricses_up[0] будет первый верхний фрактал
buf_frac_pricses_up[1] второй...
 

old6107

Активный участник
int start()
{


double buf_frac_pricses_up[200];
uint frac_up_buf_changer=0;

for(int i=0;i<Bars-1;i++)
{
if(iFractals(Symbol(), 0, MODE_UPPER, i) != 0)
{
buf_frac_pricses_up[frac_up_buf_changer]=iFractals(Symbol(), 0, MODE_UPPER, i);
frac_up_buf_changer++;
}
}

double buf_frac_pricses_down[200];
uint frac_down_buf_changer=0;

for(int k=0;k<Bars-1;k++)
{
if(iFractals(Symbol(), 0,MODE_LOWER , k) != 0)
{
buf_frac_pricses_down[frac_down_buf_changer]=iFractals(Symbol(), 0,MODE_LOWER , k);
frac_down_buf_changer++;
}
}

if((buf_frac_pricses_up[1]-buf_frac_pricses_up[0])/Point>=L))...
.................
else

if((buf_frac_pricses_down[1]-buf_frac_pricses_down[0])/Point>=L))...
................

return(0);
}

Я правильно понял? или можно как то в один цикл объединить...
И ведь на текущем баре не может быть фрактала ( 4,3,фрак,1,0 )
только начиная с третьего.... может i=3... ???

Огромное спасибо за помощь.
 
Последнее редактирование:

Milord

Местный знаток
Вопрос - к профи, как написать кусок кода???

нужно чтобы часть кода - "блок вычислений" работала не на каждом тике, а только один раз на открытии нулевой свечи, как это сделать подскажите плиз?
ЗАРАНЕЕ СПАСИБО!

PHP:
int start()
{

//---блок вычислений---
{......}

}
 

AlexeyVik

Программист mql4 mql5
нужно чтобы часть кода - "блок вычислений" работала не на каждом тике, а только один раз на открытии нулевой свечи, как это сделать подскажите плиз?
ЗАРАНЕЕ СПАСИБО!

PHP:
int start()
{

//---блок вычислений---
{......}

}
Если на каждом баре то можешь воспользоваться вот этим
Код:
void OnTick()
 {
    if(NewBar())
     {
      // здесь выполняются действия на новом баре
     }
 }/*******************************************************************/ 

 bool NewBar()
 {
    static datetime lastbar = 0;
    datetime curbar = Time[0];
    if(lastbar != curbar)
     {
      lastbar = curbar;
      return (true);
     }
    else return(false);
 }/*******************************************************************/
Такой вариант работает только на текущем ТФ. Чтобы на любом ТФ можно было отследить новый бар нужного ТФ надо Time[0] заменить на iTime() с указанием периода.
А если всего один раз, то засунь в OnInit()
 

Alexz2107

Интересующийся
Закрытие самого убыточного ордера

Здравствуйте, помогите, пожалуйста, с кодом. Нужно закрывать САМЫЙ УБЫТОЧНЫЙ ордер из открытых, при этом если этот убыток не превышает значения глобальной переменной.:please:
Что-то типа этого скрипта:
double LishBalans=XXXXXX
void CloseBiggestLoss(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderSwap()<-LishBalans) ClosePosBySelect();
}
}
}
}
}
}
Но тут нет перебора именно наибольшего убытка из всех. А я всегда больше всего парюсь именно с переборами ордеров...
 

Ugar

Гуру форума
Здравствуйте, помогите, пожалуйста, с кодом. Нужно закрывать САМЫЙ УБЫТОЧНЫЙ ордер из открытых, при этом если этот убыток не превышает значения глобальной переменной.:please:
Что-то типа этого скрипта:
double LishBalans=XXXXXX
void CloseBiggestLoss(string sy="", int op=-1, int mn=-1) {
int i, k=OrdersTotal();

if (sy=="0") sy=Symbol();
for (i=k-1; i>=0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
if (OrderProfit()+OrderSwap()<-LishBalans) ClosePosBySelect();
}
}
}
}
}
}
Но тут нет перебора именно наибольшего убытка из всех. А я всегда больше всего парюсь именно с переборами ордеров...
Сначала надо перебрать ордера сравнивая их прибыль с предыдущим, для поиска самого убыточного и запоминая его тикет и прибыль.
Потом, уже выйдя из цикла, сравнить прибыль с глобальной переменной и закрыть используя запомненный тикет.
 

Andy200577

Новичок форума
Уважаемые знатоки MQL.
Хотел бы задать вопрос по поводу внешних переменных советника, индикатора не важно.
Есть ли в MQL возможность сделать переменные неактивными для выбора (серым цветом обычно)? А именно например, есть булевый параметр, который включает и выключает использование, например, стохастика. При выборе true стохастик применяется и все его переменные можно изменить, а при выборе false стохастик не используется в торговле и по идее нужно сделать, чтобы переменные были неактивными и их нельзя было менять. Возможно ли сделать такое средствами MQL ?
Спасибо.
 
Верх