Вопросы от начинающих MQL4 MT4 MetaTrader 4 - страница 71

 
Vitalie Postolache:

А с каких это пор период - типа Double?

Вот и я говорю, что string+int - это ошибка

Но если сделать так, как я написал выше - ошибки не будет.

 
Renat Akhtyamov:

Вот и я говорю, что string+int - это ошибка

Но если сделать так, как я написал выше - ошибки не будет.


IntegerToString? Не, не слышал ;)
 
Vitalie Postolache:

IntegerToString? Не, не слышал ;)
и так и так работает норм, проблемы не вижу
 

всем привет

я новичек в программировании, но пытаюсь учиться)

у меня не большая проблема с закрытием ордера по показаниям индикатора

по поводу условий открытия и закрытия сразу скажу, открываю сделку по показаниям индюка и закрываю ордер так по показаниям но в обратную сторону, без стопов и профита

if(r > 50 && p > m)                                                                                          //условия открытия ордера на покупку

    {   

        ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"",111,0,Green);    //открытие ордера на покупку 

    }

правильно ли я пишу условие закрытия ордера?

if(r < 50 && p < m)  --- это условие на продажу и на закрытие ордера

{

        OrderClose(ticketB,0.1,Bid,5,Red);

}

и выдает possible use of uninitialized variable 'ticketB' и return value of 'OrderClose' should be checked

Ребят подскажите где я не правильно написал?



 
funnyrain8:

всем привет

я новичек в программировании, но пытаюсь учиться)

у меня не большая проблема с закрытием ордера по показаниям индикатора

по поводу условий открытия и закрытия сразу скажу, открываю сделку по показаниям индюка и закрываю ордер так по показаниям но в обратную сторону, без стопов и профита

if(r > 50 && p > m)                                                                                          //условия открытия ордера на покупку

    {   

        ticketB = OrderSend(Symbol(),OP_BUY,0.1,Ask,5,0,0,"",111,0,Green);    //открытие ордера на покупку 

    }

правильно ли я пишу условие закрытия ордера?

if(r < 50 && p < m)  --- это условие на продажу и на закрытие ордера

{

        OrderClose(ticketB,0.1,Bid,5,Red);

}

и выдает possible use of uninitialized variable 'ticketB' и return value of 'OrderClose' should be checked

Ребят подскажите где я не правильно написал?



переменная ticketB не инициализирована, т.е. не известен тип. В данном случае - это Int

Вторая ошибка о том, что необходимо проверить результат закрытия ордера на ошибки. Задайте в поиске по форуму "функция обработки ошибок"

 
Renat Akhtyamov:

переменная ticketB не инициализирована, т.е. не известен тип. В данном случае - это Int

Вторая ошибка о том, что необходимо проверить результат закрытия ордера на ошибки. Задайте в поиске по форуму "функция обработки ошибок"

это GetLastError? я чутка не могу понять логики или туплю) но как ее задать? сначала пытался все сделать с помощью OrderSelect, но это не то)

мне нужна инфа по этому всему

 
funnyrain8:

это GetLastError? я чутка не могу понять логики или туплю) но как ее задать? сначала пытался все сделать с помощью OrderSelect, но это не то)

мне нужна инфа по этому всему

Да.

Поройтесь в код-базе - полно примеров реализации.

 
Здравствуйте, я продавец сигналов, хотелось бы узнать, как можно продвигать свои сигналы, чтобы люди подписывались на них?
 
Vitalie Postolache:


А где логика? Вы ставите на  первый ордер максимальный разрешенный лот, а потом увеличиваете его для каждого следующего ордера. Вам это не кажется, мягко говоря, не очень разумным?

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

Не говоря уж о том, что инкремент цикла не может быть вещественным числом, это счётчик, целое число должно быть. А вы ставите в качестве счётчика значение лота и вычитаете из него каждую итерацию по единичке. Это крупная ошибка, очень серьёзная.

Доработайте логику сначала в голове, а потом уже пытайтесь воплотить её в код.

Значения которые не выносятся для того чтобы определить конечный лот после перемножения, он должен быть максимально возможным для открытия, по факту ордера с этими лотами возможно и не откроются, т.к. советник в небольшом промежутке времени открывает ордера, но вероятность есть и поэтому я хочу максимальный возможный первоначальный лот вычислить. Прислушался к вашему совету и вот что получилось. Что скажете на счет этой функции? Мне кажется я что то упустил и не правильно прописал, тестер немного подвисает и лот маленький на выходе получается.
//Функция расчета торгового лота
double GetLots()
{
 double lots = 0.0;
 double L9 = MarketInfo(Symbol(),MODE_MAXLOT);
 double L8 = L9 / Multipler;
 double L7 = L8 / Multipler;
 double L6 = L7 / Multipler;
 double L5 = L6 / Multipler;
 double L4 = L5 / Multipler;
 double L3 = L4 / Multipler;
 double L2 = L3 / Multipler;
 double cl = L2 / Multipler;
 double balance = AccountFreeMarginCheck(Symbol(),OP_BUY,L9);
 
 if(balance <= AccountFreeMargin())
 {
  for(int risk = 100;balance > 0 && risk > 0;risk--)
  {
   if(!IsStopped())
   {
    if(risk >= 1)
    {
     lots = (cl/100)*risk;
    }
    if(risk < 1)
    {
     for(int risk2 = 100;balance > 0 && risk2 >= 1;risk2--)
     {
      lots = (cl/100)*(risk2*0.01);
     }
    }
   }
  }
 }
 double clots = NormalizeDouble(MathMax(lots,MarketInfo(Symbol(),MODE_MINLOT)),2);
 return(clots);
}
 
Arseniy Barudkin:

А что скажете на счет этого?


То же самое скажу. С логикой не дружите. В чём проблема рассчитать сразу начальный лот, исходя из свободных средств и значения риска (вроде писалось про 3%)? Зачем так через одно место всё делать?

Берёте значение свободной маржи, умножаете на риск, делите на 100 и на значение залога для 1 лота - вот простейшая формула для расчёта лота с указанным процентом от свободной маржи. Ну ещё  шаго изменения лота надо учесть и предотвратить выход за пределы мин-макс лота, разрешённого ДЦ:

input double risk = 3; //процент свободной маржи для расчёта лота
double GetLots()
{
  double margin = MarketInfo(Symbol(),MODE_MARGINREQUIRED);
  double lotstep = MarketInfo(Symbol(),MODE_LOTSTEP);
  double rsk = MathMin(100.0,risk);
  double lotmax = MarketInfo(Symbol(), MODE_MAXLOT);
  double lotmin = MarketInfo(Symbol(), MODE_MINLOT);

  double clots = NormalizeDouble(lotstep*MathRound(AccountFreeMargin()*rsk/100/margin/lotstep),2);
  if(clots < lotmin) clots = lotmin;
  if(clots > lotmax) clots = lotmax;

return(clots);
}
Причина обращения: