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

AlexeNP

Гуру форума
хотел уже писульку писать, Vladradon все уже растолковал)
чуток добавлю - если стоплосс не нулевой (а он всегда не нулевой, не ставишь стоплосс ты, за тебя это сделает брокер и назовет его стоп-аутом), то он должен быть не меньше SymbolInfoInteger(NULL,SYMBOL_TRADE_STOPS_LEVEL) и не меньше двух спредов
 

star603

Новичок форума
Вашу мысль я понял.
Но скажите пожалуйжуйста как понимать эти моменты:

Код:
StopLoss>minst) ? StopLoss*_Point : (minst+1)*_Point;
_Point и ? вот это.

Я еще делал вот так:
Код:
//Здесь тейк профиты.Таже логика для стоплосов.
double TP1 = NormalizeDouble(Ask+minst,Digits);
double TP2 = NormalizeDouble(Bid-minst,Digits);

//Здесь открытия сделок
 if(cS1<0 && cS2<0 && cS3<0&&SWL==true)
   ticketss=OrderSend(Symbol(),OP_BUY,Lot_1,Ask,Slippage,0,TP1,"S1 buy",Magic,clrNONE);
 else if(cS1>0 && cS2>0 && cS3>0&&SWS==true)
    ticketss=OrderSend(Symbol(),OP_SELL,Lot_1,Bid,Slippage,0,TP2,"S1 sell",Magic,clrNONE);
На работоспособность проверено и ошибок не возникало. И сделки открывались хорошо и вовремя. Это часть кода, но это пока не вашно пока соредоточим свое внимание на тейкрофите.

У меня сложилось что вы не поняли мою проблему.
Начну по порядку.
1) выбираем фиксированный столос или тейкрофит сейчас не важно.
2) основная проблеа как в один кейс вместить значение для установки профита или стоплоса для продажи и покупки.

Код:
double STOPI()
  {
   switch(Loss)
     {
      case 0: SL = StopLoss*Point;
/* В этом открывке с кейсом = 0 не понятно какой это стоплос для ордера бай или сейлл. Так как для них стоплос задается по разному.
  а значение Стполос из глобальной внешней переменной которую можно менять по своему желанию
  до присоединения совы на график*/
      case 1: SL = 0*Point; break;
      case 4: SL = indikator[4][0];break; 
      case 6: SL = svecha[3][1]; break;       
     };
   return(SL);
  };

Теперь надеюсь поняли мою проблему которую я хотел поднять в том посту. Просто по другому не пойму как подругому донести ее. Или я что то упускаяю? Заранее спасибо.
 

Ugar

Гуру форума
Вашу мысль я понял.
Но скажите пожалуйжуйста как понимать эти моменты:

Код:
StopLoss>minst) ? StopLoss*_Point : (minst+1)*_Point;
_Point и ? вот это.

Я еще делал вот так:
Код:
//Здесь тейк профиты.Таже логика для стоплосов.
double TP1 = NormalizeDouble(Ask+minst,Digits);
double TP2 = NormalizeDouble(Bid-minst,Digits);

//Здесь открытия сделок
 if(cS1<0 && cS2<0 && cS3<0&&SWL==true)
   ticketss=OrderSend(Symbol(),OP_BUY,Lot_1,Ask,Slippage,0,TP1,"S1 buy",Magic,clrNONE);
 else if(cS1>0 && cS2>0 && cS3>0&&SWS==true)
    ticketss=OrderSend(Symbol(),OP_SELL,Lot_1,Bid,Slippage,0,TP2,"S1 sell",Magic,clrNONE);
На работоспособность проверено и ошибок не возникало. И сделки открывались хорошо и вовремя. Это часть кода, но это пока не вашно пока соредоточим свое внимание на тейкрофите.

У меня сложилось что вы не поняли мою проблему.
Начну по порядку.
1) выбираем фиксированный столос или тейкрофит сейчас не важно.
2) основная проблеа как в один кейс вместить значение для установки профита или стоплоса для продажи и покупки.

Код:
double STOPI()
  {
   switch(Loss)
     {
      case 0: SL = StopLoss*Point;
/* В этом открывке с кейсом = 0 не понятно какой это стоплос для ордера бай или сейлл. Так как для них стоплос задается по разному.
  а значение Стполос из глобальной внешней переменной которую можно менять по своему желанию
  до присоединения совы на график*/
      case 1: SL = 0*Point; break;
      case 4: SL = indikator[4][0];break;
      case 6: SL = svecha[3][1]; break;      
     };
   return(SL);
  };

Теперь надеюсь поняли мою проблему которую я хотел поднять в том посту. Просто по другому не пойму как подругому донести ее. Или я что то упускаяю? Заранее спасибо.
А попробуй просто
Код:
double STOPI(int type)
  {
   switch(Loss)
     {
      case 0:     if(type==OP_BUY)SL = Bid-StopLoss*Point;
                  if(type==OP_SELL)SL = Ask+StopLoss*Point;
                break;
/* В этом открывке с кейсом = 0 не понятно какой это стоплос для ордера бай или сейлл. Так как для них стоплос задается по разному.
  а значение Стполос из глобальной внешней переменной которую можно менять по своему желанию
  до присоединения совы на график*/
      case 1: SL = 0*Point; break;
      case 4: SL = indikator[4][0];break;
      case 6: SL = svecha[3][1]; break;       
     };
   return(SL);
  };
 

star603

Новичок форума
double STOPI(int type)
{
switch(Loss)
{
case 0: if(type==OP_BUY)SL = Bid-StopLoss*Point;
if(type==OP_SELL)SL = Ask+StopLoss*Point;
break;
/* В этом открывке с кейсом = 0 не понятно какой это стоплос для ордера бай или сейлл. Так как для них стоплос задается по разному.
а значение Стполос из глобальной внешней переменной которую можно менять по своему желанию
до присоединения совы на график*/
case 1: SL = 0*Point; break;
case 4: SL = indikator[4][0];break;
case 6: SL = svecha[3][1]; break;
};
return(SL);
};
Я понял сначало надо открыть ордера без стоплосов.
 

star603

Новичок форума
Как предпологал.:
1) Сначала открываем ордера с нулевыми стопами.
2) Потом выбираем ордер и подставляем от типа ордера лоси и профи
А попробуй просто
Код:
double STOPI(int type)
  {
   switch(Loss)
     {
      case 0:     if(type==OP_BUY)SL = Bid-StopLoss*Point;
                  if(type==OP_SELL)SL = Ask+StopLoss*Point;
                break;
/* В этом открывке с кейсом = 0 не понятно какой это стоплос для ордера бай или сейлл. Так как для них стоплос задается по разному.
  а значение Стполос из глобальной внешней переменной которую можно менять по своему желанию
  до присоединения совы на график*/
      case 1: SL = 0*Point; break;
      case 4: SL = indikator[4][0];break;
      case 6: SL = svecha[3][1]; break;      
     };
   return(SL);
  };

Позже напишу пример как я хочу это воплостить. Пока с вашим кодом выдал ошибку.
'STOPI' - wrong parameters count Umr.mq4 132 4
 

Ugar

Гуру форума
Как предпологал.:
1) Сначала открываем ордера с нулевыми стопами.
2) Потом выбираем ордер и подставляем от типа ордера лоси и профи


Позже напишу пример как я хочу это воплостить. Пока с вашим кодом выдал ошибку.
'STOPI' - wrong parameters count Umr.mq4 132 4
Ну так в функции появился аргумет тип ордера, так и при вызове функции нужно указать его.
Если исполнение по Market то да, рыночные надо открывать без стопов и тейков потом модифицировать ордер добавляя их.
 

adamir

Активный участник
Известно, что форма свечей Н4 зависит от времени работы брокера. Можно ли как-то сгенерировать графики H4 со свечами, открытие которых сдвинуто, например, на 2 часа?
 

Ugar

Гуру форума
Известно, что форма свечей Н4 зависит от времени работы брокера. Можно ли как-то сгенерировать графики H4 со свечами, открытие которых сдвинуто, например, на 2 часа?
Можно написать индикатор или советник создающий 4 часовой файл истории, например из часового или мельче, в котором будут сдвинутые 4 часовые свечи.
В терминале открыть офлайн график из этого файла истории.
 

adamir

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

Ugar

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

star603

Новичок форума
Код:
int regimtorga[3];//Утановка режима торгов относительно свопов
//*****************************************************************************
void OnTick()
  {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*************************Ввод в код программы массивов и пользовательских функций***************************************************************
 ui(regimtorga);
 TORGI();
 Comment(TORGI());
//************************************************************************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  }
//Пользовательские функции
void ui(int &gh3[3]) //Установка режима своповой торговли
  {
   double SWP = MarketInfo(Symbol(),MODE_SWAPSHORT);
   double SWPK = MarketInfo(Symbol(),MODE_SWAPLONG);
   if(SWP>0)
      gh3[0]= 1;//Продажи
   if(SWPK>0)
      gh3[1]= 2;//Покупки
   if(SWP<0 && SWPK<0)
      gh3[2]= 3;//Без разницы
  };
//+------------------------------------------------------------------+
int TORGI()
  {
   switch(Torgi)
     {
      case 0:
         torgi = regimtorga[0];//фиксированныый лот
         break;
      case 1:
         torgi = regimtorga[1];//Исходя из баланса
         break;
      case 2:
         torgi = regimtorga[0];;//Исходя из Эквити
         break;
     }
    return(torgi);
  }
//+------------------------------------------------------------------+

Не знаю почему то на которых работает гарфикак, но большинства графиков показывает 0 Хотя должен показывать 1-3 одно число.
 

star603

Новичок форума
Код:
int regimtorga[3];//Утановка режима торгов относительно свопов
//*****************************************************************************
void OnTick()
  {
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//*************************Ввод в код программы массивов и пользовательских функций***************************************************************
 ui(regimtorga);
 TORGI();
 Comment(TORGI());
//************************************************************************************************************************************************
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  }
//Пользовательские функции
void ui(int &gh3[3]) //Установка режима своповой торговли
  {
   double SWP = MarketInfo(Symbol(),MODE_SWAPSHORT);
   double SWPK = MarketInfo(Symbol(),MODE_SWAPLONG);
   if(SWP>0)
      gh3[0]= 1;//Продажи
   if(SWPK>0)
      gh3[1]= 2;//Покупки
   if(SWP<0 && SWPK<0)
      gh3[2]= 3;//Без разницы
  };
//+------------------------------------------------------------------+
int TORGI()
  {
   switch(Torgi)
     {
      case 0:
         torgi = regimtorga[0];//фиксированныый лот
         break;
      case 1:
         torgi = regimtorga[1];//Исходя из баланса
         break;
      case 2:
         torgi = regimtorga[0];;//Исходя из Эквити
         break;
     }
    return(torgi);
  }
//+------------------------------------------------------------------+

Не знаю почему то на которых работает гарфикак, но большинства графиков показывает 0 Хотя должен показывать 1-3 одно число.
только на евро доллар работает и показывает как надо. Не пойму что не так.
 

mobidik

-----
void ui(int &gh3[3]) //Установка режима своповой торговли
Зачем здесь массив? Достаточно интовой переменной, соответственно, убрать массив и в regimtorga[].
Где объявлены переменные torgi и Torgi
Torgi - чему она равна?
 

star603

Новичок форума
Код:
enum sposobtorgovli//+
  {
   polswop,//Торговать с + свопом покупки
   polswoppok,//Торговать с + свопом продажи
   bezraznici//Тоговать как есть
  };
sinput sposobtorgovli Torgi=0;//Выбрать способ торговли
int torgi;

забыл до копировать
 

vitto.mq4

Местный знаток
Помогите разобраться
У одного брокера этот сов работает нормально и без ошибок , у другого выдает такие ошибки:
2022.04.21 15:27:03.383 BR EA GBPUSD.,Daily: zero divide in 'BR EA.mq4' (228,84)
2022.04.21 15:43:10.183 BR EA EURUSD.,M5: zero divide in 'BR EA.mq4' (228,84)
вот код этой строки:
Lot_1=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(P_1,MODE_TICKVALUE)*100*D_1),dig_1);

Знатоки подскажите в чем может быть проблема?
 

Fillelin

Элитный участник
Помогите разобраться
У одного брокера этот сов работает нормально и без ошибок , у другого выдает такие ошибки:
2022.04.21 15:27:03.383 BR EA GBPUSD.,Daily: zero divide in 'BR EA.mq4' (228,84)
2022.04.21 15:43:10.183 BR EA EURUSD.,M5: zero divide in 'BR EA.mq4' (228,84)
вот код этой строки:
Lot_1=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(P_1,MODE_TICKVALUE)*100*D_1),dig_1);

Знатоки подскажите в чем может быть проблема?
Здравствуйте.
Попробуйте заменить на это:

if((100*Risk)!= 0 &&(MarketInfo(P_1,MODE_TICKVALUE)*100*D_1)!= 0) Lot_1=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(P_1,MODE_TICKVALUE)*100*D_1),dig_1);
 

vitto.mq4

Местный знаток
Здравствуйте.
Попробуйте заменить на это:

if((100*Risk)!= 0 &&(MarketInfo(P_1,MODE_TICKVALUE)*100*D_1)!= 0) Lot_1=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(P_1,MODE_TICKVALUE)*100*D_1),dig_1);
Спасибо за помощь , но дальше сыплет ошибки:
2022.04.21 16:19:41.350 BR EA EURUSD.,M5: zero divide in 'BR EA.mq4' (295,60)

вот эта строка кода:
izeBar_1=(iClose(P_1,TimeFrame,1)-iOpen(P_1,TimeFrame,1))/MarketInfo(P_1,MODE_POINT);
 

mobidik

-----
Помогите разобраться
У одного брокера этот сов работает нормально и без ошибок , у другого выдает такие ошибки:
2022.04.21 15:27:03.383 BR EA GBPUSD.,Daily: zero divide in 'BR EA.mq4' (228,84)
2022.04.21 15:43:10.183 BR EA EURUSD.,M5: zero divide in 'BR EA.mq4' (228,84)
вот код этой строки:
Lot_1=NormalizeDouble(AccountBalance()/100*Risk/(MarketInfo(P_1,MODE_TICKVALUE)*100*D_1),dig_1);

Знатоки подскажите в чем может быть проблема?
Спасибо за помощь , но дальше сыплет ошибки:
2022.04.21 16:19:41.350 BR EA EURUSD.,M5: zero divide in 'BR EA.mq4' (295,60)

вот эта строка кода:
izeBar_1=(iClose(P_1,TimeFrame,1)-iOpen(P_1,TimeFrame,1))/MarketInfo(P_1,MODE_POINT);

Общие у этих двух строках: P_1 - возможно, у этого брокера у символа есть суффикс/префикс.
Перед строками, на которые ругается, выведи в принты и все станет ясно.

PS.
Может и ошибаюсь, но похоже, что символ прописывается с точкой в конце.
 

vitto.mq4

Местный знаток
Общие у этих двух строках: P_1 - возможно, у этого брокера у символа есть суффикс/префикс.
Перед строками, на которые ругается, выведи в принты и все станет ясно.

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


Да именно точка в конце символа есть.

Вот код описания символов:

string P_1,P_2,P_3,P_4,P_5;

if(IsTesting())
{P_1=Symbol();
P_2=Symbol();
P_3=Symbol();
P_4=Symbol();
P_5=Symbol();}
else
{P_1=pEURUSD;
P_2=pGBPUSD;
P_3=pAUDUSD;
P_4=pUSDCAD;
P_5=pUSDCHF;}
 
Последнее редактирование:
Верх