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

MakarFX

Элитный участник
Если это пользовательская фукнкия которая включается через енум список , то вопрос мне нужно одельно прописать пользовательскую функцию для модернизации ордера? Ведь если я напишу модерннизаюцию следующей строкой он же не сможет вернуть весь ордер целиком.
Я не вижу здесь модификации-от слова "вообще".
Ты уже так долго возишься с этой функцией...
Проще спросить как сделать то что ты хочешь.
 

star603

Новичок форума
Тогда объясни, пожалуйста, что ты хочешь сделать этим кодом?
Код:
         if(OrderType()==OP_BUY)
           {
             O = OrderOpenPrice();
             StopLoss2 = Bid-MarketInfo(_Symbol,MODE_STOPLEVEL)*Point+OrderStopLoss()-StopLoss*Point;
           };
Моя цель:
1) Выбрать ордер у которого лось равен 0. у меня это по умолчанию все.
2) Сформировать новы стоплос с учетом минимальных стопов и уровня замороски.
3) И далее модернизировать его

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

MakarFX

Элитный участник
Моя цель:
1) Выбрать ордер у которого лось равен 0. у меня это по умолчанию все.
2) Сформировать новы стоплос с учетом минимальных стопов и уровня замороски.
3) И далее модернизировать его

Но потом не знаю только как остановить эту ловину изменений чтобы был только один раз а не превратился в трелинг стоп.
1) Цикл перебора ордеров.
C-подобный:
Надо либо так
for(i=OrdersTotal()-1; i>=0; i--)
либо так
for(i=0; i<OrdersTotal(); i++)
2) Модификация ордера делается с помощью функции
Код:
OrderModify               

Изменяет параметры ранее открытых или отложенных ордеров.

bool  OrderModify(
   int        ticket,      // номер ордера
   double     price,       // цена открытия
   double     stoploss,    // stop loss
   double     takeprofit,  // take profit
   datetime   expiration,  // время истечения ордера
   color      arrow_color  // цвет
);
 

star603

Новичок форума
1) Цикл перебора ордеров.
C-подобный:
Надо либо так
for(i=OrdersTotal()-1; i>=0; i--)
либо так
for(i=0; i<OrdersTotal(); i++)
2) Модификация ордера делается с помощью функции
Код:
OrderModify              

Изменяет параметры ранее открытых или отложенных ордеров.

bool  OrderModify(
   int        ticket,      // номер ордера
   double     price,       // цена открытия
   double     stoploss,    // stop loss
   double     takeprofit,  // take profit
   datetime   expiration,  // время истечения ордера
   color      arrow_color  // цвет
);
Совторым проблемы будут проблемы потому что стоплосс идет через выбор
Код:
enum stopi
  {
   ba,//Фиксированные стопы
   bc,//Торговля без стопов
   bd,//Задаваемые стопы
   bf,//Стопы по МА
   bs,//Стопы по Сар
   bg,//Стопы по теням свечей
   bz,//Стопы по лоу свечам
   br,//Стопы по определенным пунктам
   bt//Торговля в безубыток
  };
 

star603

Новичок форума
Код:
Я не вижу здесь модификации-от слова "вообще".
Потому что рано писать эту функцию.
 

MakarFX

Элитный участник
Совторым проблемы будут проблемы потому что стоплосс идет через выбор
Код:
enum stopi
  {
   ba,//Фиксированные стопы
   bc,//Торговля без стопов
   bd,//Задаваемые стопы
   bf,//Стопы по МА
   bs,//Стопы по Сар
   bg,//Стопы по теням свечей
   bz,//Стопы по лоу свечам
   br,//Стопы по определенным пунктам
   bt//Торговля в безубыток
  };
Создаешь функцию определяющую стоплосс, а потом перебираешь ордера и модифицируешь
 

star603

Новичок форума
Тогда зачем перебирать ордера?
Этих функций будет на каждый выбор вида стоплоса
Код:
enum stopi
  {
   ba,//Фиксированные стопы
   bc,//Торговля без стопов
   bd,//Задаваемые стопы
   bf,//Стопы по МА
   bs,//Стопы по Сар
   bg,//Стопы по теням свечей
   bz,//Стопы по лоу свечам
   br,//Стопы по определенным пунктам
   bt//Торговля в безубыток
  };

Код:
sinput stopi Loss =0;//Выбрать уровень стопов

Код:
int STOP()
{
 switch(Loss)
  {
   case 0:Stopi0();break;
  }
 return(Loss);
}
 

MakarFX

Элитный участник
Этих функций будет на каждый выбор вида стоплоса
Лучше так
C-подобный:
double Stopi()//Установка стопов
  {
   double _stoploss=0;
   if(Loss==ba){_stoploss=bla bla bla;}
   if(Loss==bc){_stoploss=bla bla bla;}
   if(Loss==bd){_stoploss=bla bla bla;}
   if(Loss==bf){_stoploss=bla bla bla;}
   if(Loss==bs){_stoploss=bla bla bla;}
   if(Loss==bg){_stoploss=bla bla bla;}
   if(Loss==bz){_stoploss=bla bla bla;}
   if(Loss==br){_stoploss=bla bla bla;}
   if(Loss==bt){_stoploss=bla bla bla;}
   return(_stoploss);
  };
 
Последнее редактирование:

star603

Новичок форума
Лучше так
C-подобный:
double Stopi()//Установка стопов
  {
   int _stoploss=0;
   if(Loss==ba){_stoploss=bla bla bla;}
   if(Loss==bc){_stoploss=bla bla bla;}
   if(Loss==bd){_stoploss=bla bla bla;}
   if(Loss==bf){_stoploss=bla bla bla;}
   if(Loss==bs){_stoploss=bla bla bla;}
   if(Loss==bg){_stoploss=bla bla bla;}
   if(Loss==bz){_stoploss=bla bla bla;}
   if(Loss==br){_stoploss=bla bla bla;}
   if(Loss==bt){_stoploss=bla bla bla;}
   return(_stoploss);
  };
Теперь весь код переписывать. Спасибо. ))) А в чем смысл _stoploss?
 

MakarFX

Элитный участник
Теперь весь код переписывать. Спасибо. ))) А в чем смысл _stoploss?
Эта функция выберет нужный вариант стоплосса, сделает расчет и выдаст готовый "_stoploss"
а его ставишь в функцию OrderModify

PS там надо "double" _stoploss=0;
моя ошибка
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Этих функций будет на каждый выбор вида стоплоса
Код:
enum stopi
  {
   ba,//Фиксированные стопы
   bc,//Торговля без стопов
   bd,//Задаваемые стопы
   bf,//Стопы по МА
   bs,//Стопы по Сар
   bg,//Стопы по теням свечей
   bz,//Стопы по лоу свечам
   br,//Стопы по определенным пунктам
   bt//Торговля в безубыток
  };

Код:
sinput stopi Loss =0;//Выбрать уровень стопов

Код:
int STOP()
{
 switch(Loss)
  {
   case 0:Stopi0();break;
  }
 return(Loss);
}
Тут проблема в неполноте действий в switch и неправильного возвращаемого значения.
В этом случае лучше будет вычислять конкретную цену прямо в свиче.
Типа так:
Код:
 double STOP(// Думаю сюда лучше передать тип ордера)
{
 double priceLoss = 0.0;
 switch(Loss)
  {
   case 0 : 
   // В зависимости от типа ордера вычислить priceLoss 
   break;
   case 1 : 
   priceLoss = 0.0;
   break;
 // И так далее…
  }
 return(priceLoss );
}
 

alvesrj

Прохожий
Как ежечасно обновлять историю символов? И как мне обновлять эту информацию о томе каждый час?

Кто-нибудь может мне помочь. Благодарный.

int OnInit()


{
if(!IsDllsAllowed())
{
Alert("Make Sure DLL Import is Allowed");
ExpertRemove();
return(INIT_FAILED);
}




//------------------------------------------------------
{

//---
def_MaxSpread=def_MaxSpread*1;
gg_Point=Point;
if(Digits==5 || Digits==3)
{
gg_Point = gg_Point *10;
Slippage = Slippage *10;

}


ChartSetInteger(0,17,0,0);
ChartSetInteger(0,0,1);
string account_server=AccountInfoString(3);
if(account_server=="")
{
account_server="default";
}
datapath=TerminalInfoString(3)+"\\history\\"
+account_server+"\\"+Symbol()+"240"+".hst";
ReadFileHst(datapath);

//---
return(INIT_SUCCEEDED);

}


}

void OnTick()
{

static datetime previousBar;
if(previousBar!=Time[0])
{
previousBar=Time[0];
ChartRedraw();
}
else
{
return;
}
if(iVolume(Symbol(),PERIOD_H1,0)>iVolume(Symbol(),PERIOD_H1,1)) //&& (iVolume(Symbol(),PERIOD_H1,0)<iVolume(Symbol(),PERIOD_H1,1)))
return;

if(!BytesToRead>0)
return;

int pos = -1 ;
for(int i = 0 ; i < BytesToRead - 1 ; i++)
{
if(!(data[0]<Time[0]))
break;
pos = i + 1;
}
 

star603

Новичок форума
Тут проблема в неполноте действий в switch и неправильного возвращаемого значения.
В этом случае лучше будет вычислять конкретную цену прямо в свиче.
Типа так:
Код:
 double STOP(// Думаю сюда лучше передать тип ордера)
{
 double priceLoss = 0.0;
 switch(Loss)
  {
   case 0 :
   // В зависимости от типа ордера вычислить priceLoss
   break;
   case 1 :
   priceLoss = 0.0;
   break;
 // И так далее…
  }
 return(priceLoss );
}
Как такая идея?
Код:
double Stopi0()//
{
 double _SL2 =0.0;
 if(Loss==0)
  {
   /*
   Сюда думаю написать перебора ордеров.
   Затем выбрать ордер. И соглано типу ордера модернизировать стопы.
   А чтобы это не происходило на новом тике.
   Абьсолютно весь код сделаю чтобы выполнялся на новом баре.
   */
  }
 return(_SL2);
 

star603

Новичок форума
В чем неполнота действий и неправильное возвращение значений? Заранее спасибо..


Тут проблема в неполноте действий в switch и неправильного возвращаемого значения.
В этом случае лучше будет вычислять конкретную цену прямо в свиче.
Типа так:
Код:
 double STOP(// Думаю сюда лучше передать тип ордера)
{
 double priceLoss = 0.0;
 switch(Loss)
  {
   case 0 :
   // В зависимости от типа ордера вычислить priceLoss
   break;
   case 1 :
   priceLoss = 0.0;
   break;
 // И так далее…
  }
 return(priceLoss );
}
 

vladradon

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

MakarFX

Элитный участник
Как такая идея?
Код:
double Stopi0()//
{
 double _SL2 =0.0;
 if(Loss==0)
  {
   /*
   Сюда думаю написать перебора ордеров.
   Затем выбрать ордер. И соглано типу ордера модернизировать стопы.
   А чтобы это не происходило на новом тике.
   Абьсолютно весь код сделаю чтобы выполнялся на новом баре.
   */
  }
 return(_SL2);
Тогда лучше 'bool"
C-подобный:
bool Stopi0()
{
 double _SL2 =0.0;
 if(Loss==0)
  {
   /*
   Сюда думаю написать перебора ордеров.
   Затем выбрать ордер. И соглано типу ордера модернизировать стопы.
   А чтобы это не происходило на новом тике.
   Абьсолютно весь код сделаю чтобы выполнялся на новом баре.
   */ return(true);
  }
 return(false);
}
 

star603

Новичок форума
Я бы задал переменную, в которой запоминал текущее количество ордеров, и если количество ордеров станет отличаться от запомненного и не нулевое, то запускал бы нужные функции по сопровождению стоплосса и т.п..
какие недостатки в моей идеи?
 
Верх