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

AlexeyVik

Программист mql4 mql5
Поздравляю всех с наступающим НГ! Подскажите, пожалуйста, ответ на глупый вопрос! В моей системе используются некоторые компоненты сторонних разработчиков и во многих местах в них используется return (0); вместо простого return; хотя тип этих скриптов void и по факту в работе никакие данные они не возвращают, просто выполняют действия. И вот в чем вопрос - это сделано вследствие неграмотности или есть какие-то подводные камни в языке, из-за чего и используется некорректный возврат?
Старайтесь побыстрей перейти на формат нового mql4 и используйте #property strict
Тогда все такие неправильные моменты будут показываться в виде предупреждений.
А ответить на вопрос, мне кажется, даже сам написатель не сможет... Никаких камней быть не может. В функциях типа void оператор return выполняет закрывающая фигурная скобка. Либо используется return без параметров для преждевременного выхода из функции.
 

Alexz2107

Интересующийся
Старайтесь побыстрей перейти на формат нового mql4 и используйте #property strict
Тогда все такие неправильные моменты будут показываться в виде предупреждений.
А ответить на вопрос, мне кажется, даже сам написатель не сможет... Никаких камней быть не может. В функциях типа void оператор return выполняет закрывающая фигурная скобка. Либо используется return без параметров для преждевременного выхода из функции.
Вот у меня и показывает в виде предупреждений, хочется сократить их количество. Что никаких камней - это радует!:)
 

Yura Vakulenko

Активный участник

Вобще-то не понятно, зачем засекать время, если оно здесь ни к чему.
У Вас закрытия по сигналу, а не по времени. Если я все верно понял.

Кроме того Ваш код не удобно читать ))

Вот кусок Вашего кода:
Понимаю так: Сигнал в BUY
если не включен реверс - покупаем
если включен - продаем
Но сигнал-то BUY. Не совсем понял эту конструкцию.

Еще у Вас две переменные, по сути означающие одно и то же: mode_reverse и Close_on_Oposite.
Если включен реверс, то позицию надо закрывать без необходимости проверки Close_on_Oposite.
Ваша стратегия, как я понял, не позволяет держать больше одной позиции, а это значит что одну из этих переменных надо удалить за ненадобностью.
Значит, если реверс выключен, то продолжаем держать позицию и игнорируем все сигналы в противоход.
Резюме: Close_on_Oposite - удаляем.

Далее. Не плохо бы привести код в примерно такой вид:
Код:
//--- Торговые константы
#define        ENTER_NONE              0
#define        ENTER_SELL_BIG          1
#define        ENTER_BUY_BIG           2
#define        ENTER_SELL_SMALL        3
#define        ENTER_BUY_SMALL         4

#define        POS_SELL                5
#define        POS_BUY                 6

#define        PART                    6
#define        ALL                     6

void OnTick()
  {
//---
   // Ищем сигнал для входа
   int nResult = SearchEnter();
   // Если позиции нет
   if(!pos.exist)
      // Если есть сигнал - отправляем его в блок торговых сделок
      if(nResult != ENTER_NONE) TradingBlock(nResult);
   // Если позиция есть
   else
   {
      // Позиция BUY
      if(pos.type == POS_BUY)
      {
         // Закрыть полностью
         if(nResult == ENTER_SELL_BIG) ClosePos(ALL);
         // Закрыть часть
         if(nResult == ENTER_SELL_SMALL) ClosePos(PART);
      }
      // Позиция SELL
      if(pos.type == POS_SELL)
      {
         // Закрыть полностью
         if(nResult == ENTER_BUY_BIG) ClosePos(ALL);
         // Закрыть часть
         if(nResult == ENTER_BUY_SMALL) ClosePos(PART);
      }
   }
   
  }
//+------------------------------------------------------------------+
int SearchEnter()
{
   int nResult = ENTER_NONE;
   
   return(nResult);
}
Проще вникать в него другим и самому приятней ))
Хотя это дело вкуса.

Спасибо за подсказки! Дело в том, что мне нужно чтобы советник ТОРГОВАЛ ТОЛЬКО ПО ОТКРЫТИЮ БАРА, а не на каждом тике! а стрелка на сигнал может появится и на 0 баре! но мне нужно чтобы сделка совершалась только после закрытия сигнального бара по цене открытия след. бара. Поэтому там указано явное условие торговли по открытию бара.

Это на данном этапе в рынке не больше одной позиции. А будет еще и усреднение и вывод в БУ. поэтому, там нужны 2 переменные.

mode_reverse и Close_on_Oposite... введены две переменные, так как предполагается закрытие позиций не только по противоположному основному сигналу, но и по дополнительным сигналам от другого индикатора. Но эта часть кода еще не реализована, так как не знаю, как ее написать). да, с текущим вариантом кода - вы правы..достаточно и mode_reverse , но в этом режиме будут открываться продажи (закрываться покупки) по сигналу на покупку и наоборот - для сигнала на продажу.

Я сейчас пересмотрю код в соотв. с вашими рекомендациями.

И ещё я не знаю как привязывается продукт из маркета. Может к терминалу?
Они привязываются к Имени пользователя в сообществе МКЛ5 и к конкретному ПК (на котором можно устанавливать продукт в разные терминалы разных брокеров.) Т.е на другом ПК - этот индикатор не запустится, если его не актививровать на этом ПК. А для активации на другом ПК - нужны мой логин и пароль от сообщества МКЛ5 и кол-во свободных активаций (при покупке дается 5 активаций. У меня не осталось ни одной.) Поэтому я и говорю, что не могу вам дать инди, так как у вас он не запустится. А триальной версии там нету. В противном случае я бы давно все скинул! Это не секрет. Речь об этом продукте.. _https://www.mql5.com/ru/market/product/3892

Я начну с начала) :) Спасибо!
 
Последнее редактирование:

matro3

Почетный гражданин
Если стрелка появилась на нулевом баре, что ей мешает остаться на первом?
Или она пропадает?
Снять значения индикатора можно с любого бара, где он рисуется.

Close_on_Oposite имеет говорящее название.
И, если это может быть сигнал на закрытие от другого индикатора, а не сигнал на разворот от того же индикатора, то зачем проверять его в сигналах на покупку?
Это ведь сигнал на закрытие?
 

Yura Vakulenko

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

Close_on_Oposite имеет говорящее название.
И, если это может быть сигнал на закрытие от другого индикатора, а не сигнал на разворот от того же индикатора, то зачем проверять его в сигналах на покупку?
Это ведь сигнал на закрытие?

Стрелка, которая может появится на 0 баре - на 0 баре так может и пропасть. а с первого бара она уже никогда и никуда не пропадет) Большие стрелки - это сигналы на открытие (Закрытие) по этому индикатору. Close_on_Oposite - это сигнал на закрытие от этого индикатора. Т.е. появление против. напралению позиции стрелки))
а проверять это нужно в сигналах на закрытие-открытие.. потому как я не знаю, с какого сигнала советник начнет открыать сделки после установки на график (С продаж илди с покупок. поэтому там и провереться..)
 
Последнее редактирование:

Yura Vakulenko

Активный участник
Для меня вникато в предложенный вами вариант кода совсем не просто! я вообще не понимаю, что это вы мне там написали! Это совсем другой сиснтаксис в 300 раз сложнее, чем мой! что это за блоки #define ? почему там цифры? там еще для всех операций нужно писать свои функции. я же говрю, я еще не настолько мега крутой программер, чтобы все в функции от функций запихивать..
//--- Торговые константы
#define ENTER_NONE 0
#define ENTER_SELL_BIG 1
#define ENTER_BUY_BIG 2
#define ENTER_SELL_SMALL 3
#define ENTER_BUY_SMALL 4

#define POS_SELL 5
#define POS_BUY 6

#define PART 6
#define ALL 6

void OnTick()
{
//---
// Ищем сигнал для входа
int nResult = SearchEnter();
// Если позиции нет
if(!pos.exist)
// Если есть сигнал - отправляем его в блок торговых сделок
if(nResult != ENTER_NONE) TradingBlock(nResult);
// Если позиция есть
else
{
// Позиция BUY
if(pos.type == POS_BUY)
{
// Закрыть полностью
if(nResult == ENTER_SELL_BIG) ClosePos(ALL);
// Закрыть часть
if(nResult == ENTER_SELL_SMALL) ClosePos(PART);
}
// Позиция SELL
if(pos.type == POS_SELL)
{
// Закрыть полностью
if(nResult == ENTER_BUY_BIG) ClosePos(ALL);
// Закрыть часть
if(nResult == ENTER_BUY_SMALL) ClosePos(PART);
}
}

}
//+------------------------------------------------------------------+
int SearchEnter()
{
int nResult = ENTER_NONE;

return(nResult);
}
 

eevviill

Заблокирован
Спасибо за подсказки! Дело в том, что мне нужно чтобы советник ТОРГОВАЛ ТОЛЬКО ПО ОТКРЫТИЮ БАРА, а не на каждом тике! а стрелка на сигнал может появится и на 0 баре! но мне нужно чтобы сделка совершалась только после закрытия сигнального бара по цене открытия след. бара. Поэтому там указано явное условие торговли по открытию бара.

Это на данном этапе в рынке не больше одной позиции. А будет еще и усреднение и вывод в БУ. поэтому, там нужны 2 переменные.

mode_reverse и Close_on_Oposite... введены две переменные, так как предполагается закрытие позиций не только по противоположному основному сигналу, но и по дополнительным сигналам от другого индикатора. Но эта часть кода еще не реализована, так как не знаю, как ее написать). да, с текущим вариантом кода - вы правы..достаточно и mode_reverse , но в этом режиме будут открываться продажи (закрываться покупки) по сигналу на покупку и наоборот - для сигнала на продажу.

Я сейчас пересмотрю код в соотв. с вашими рекомендациями.

Они привязываются к Имени пользователя в сообществе МКЛ5 и к конкретному ПК (на котором можно устанавливать продукт в разные терминалы разных брокеров.) Т.е на другом ПК - этот индикатор не запустится, если его не актививровать на этом ПК. А для активации на другом ПК - нужны мой логин и пароль от сообщества МКЛ5 и кол-во свободных активаций (при покупке дается 5 активаций. У меня не осталось ни одной.) Поэтому я и говорю, что не могу вам дать инди, так как у вас он не запустится. А триальной версии там нету. В противном случае я бы давно все скинул! Это не секрет. Речь об этом продукте.. _https://www.mql5.com/ru/market/product/3892

Я начну с начала) :) Спасибо!
Глянь мой шаблон.
 

Вложения

  • Shabl.mq4
    17,3 КБ · Просмотры: 27

AlexeyVik

Программист mql4 mql5
Они привязываются к Имени пользователя в сообществе МКЛ5 и к конкретному ПК (на котором можно устанавливать продукт в разные терминалы разных брокеров.) Т.е на другом ПК - этот индикатор не запустится, если его не актививровать на этом ПК. А для активации на другом ПК - нужны мой логин и пароль от сообщества МКЛ5 и кол-во свободных активаций (при покупке дается 5 активаций. У меня не осталось ни одной.) Поэтому я и говорю, что не могу вам дать инди, так как у вас он не запустится. А триальной версии там нету. В противном случае я бы давно все скинул! Это не секрет. Речь об этом продукте.. _https://www.mql5.com/ru/market/product/3892

Я начну с начала) :) Спасибо!
Ну вот и встало всё на свои места...
И не жалко было платить за то что лежит совсем бесплатно???
 

Вложения

  • HalfTrend 1.01.mq4
    4,6 КБ · Просмотры: 43
  • traderdream-evolution-screen-5774[1].png
    traderdream-evolution-screen-5774[1].png
    15 КБ · Просмотры: 48
  • 00.png
    00.png
    32 КБ · Просмотры: 37
Последнее редактирование:

Yura Vakulenko

Активный участник
Ну вот и встало всё на свои места...
И не жалко было платить за то что лежит совсем бесплатно???

Вот, Блин! вот это да!! и что, давно он в бесплатном доступе есть? блин.. а я не знал даже.. конечно, жалко! Огромное вам спасибо! да уж.. :facepalm::facepalm: а есть где-то здесь на форуме тема, где именно можно разыскать то, что продается в маркете? может быть уже есть бесплатные варианты, чтобы не платить деньги и чтобы не вышло, как в этотр раз?

eevviill сказал(а):
Глянь мой шаблон.
Спасибо большое, сейчас гляну!
 

AlexeyVik

Программист mql4 mql5
Вот, Блин! вот это да!! и что, давно он в бесплатном доступе есть? блин.. а я не знал даже.. конечно, жалко! Огромное вам спасибо! да уж.. :facepalm::facepalm: а есть где-то здесь на форуме тема, где именно можно разыскать то, что продается в маркете? может быть уже есть бесплатные варианты, чтобы не платить деньги и чтобы не вышло, как в этотр раз?
Всё гораздо проще. Прежде чем купить надо читать отзывы и обсуждение на странице продажи продукта. Там и сказано что этот дрем тренд поразительно похож на ози и попользовавшись поисковиком, я предпочитаю яндекс, находишь то что уже давно лежит в свободном доступе.
Дай тебе Бог не попадать в сети таких барыг в новом году.

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

Yura Vakulenko

Активный участник
Ну вот и встало всё на свои места...
И не жалко было платить за то что лежит совсем бесплатно???

Спасибо большое!! НО! Я вот не могу понять! ... дело в том, что сигналы этот индикатор дает точно такие же как и тот, который я купил в маркете! Они одинаковы! НО!! почему в тестере стратегий.. тестирование с индикатором из маркета "по открытым барам" занимает 2-3 минуты за 2 года (2013-2015), а с индикатором, который вы мне скинули, где исходный код есть - аналогичное тестирование с одинаковыми параметрами и "по открытым барам" за те же 2 года занимает около 40 минут!! Еле ползет график!! Я уже все перепробовал! Почему так? Почему тест такой медленный?

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

mobidik

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

Так ведь сам писал:

Стрелка, которая может появится на 0 баре - на 0 баре так может и пропасть. а с первого бара она уже никогда и никуда не пропадет...

Так в том варианте, что не с маркета, стрелка появляется на закрытом баре. Вот тебе еще один вариант Ози с возможностью выбора сигнального бара и выведенными настройками, но без стрелок:
 

Вложения

  • Ozymandias„(F).mq4
    2,9 КБ · Просмотры: 37

Yura Vakulenko

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

Огромное спасибо! Ваш исходник ведет себя гораздо лучше, чем тот, который выложили на пост выше! В тестере стратегий тест по этому исходному коду проходит так же быстро (По открытию бара), как и по моему платному индикатору из маркета! Я прикрутил к индикатору стрелки, так, что , если кому нужно - скачайте со стрелками)

И у меня еще один вопрос! Как мне рисовать на графике максимальную просадку по Средствам (в пунктах) для каждого из открытих рыночныых ордеров? я в рисунке привел пример (ТОлстая голубая трендовая линия, которой обозначил максим. просадку и где она должна рисоваться.. )

и на графике так же нужно вывести текстовые сообщения с максимальной и минимальной и средней просадкой по средствам за весь период торговли (С начала открытие первого ордера)
 

Вложения

  • Ozymandias„(F).mq4
    3,4 КБ · Просмотры: 33
  • EURUSDproM30_ddn.png
    EURUSDproM30_ddn.png
    97,4 КБ · Просмотры: 48

Yura Vakulenko

Активный участник
Думаю, здесь скоро прописку получу))

Настучал я вот функцию для рисования, как я предполагал максимальной просадки для ордеров.. а она что-то не то рисует.. не могу понять, в чем причина) Смотрите на картинке, что нарисовала)

вот код...:D:)

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

//+------------------------------------------------------------------+
bool CreateTLine(string NAME,color col,datetime time1,double price1,datetime time2,double price2,bool ray=true,int window=0,int width=2)
{
string name=prefix+NAME;
if(ObjectFind(name)!=window)
ObjectCreate(name,OBJ_TREND,window,time1,price1,time2,price2);

ObjectSet(name,OBJPROP_WIDTH,width);
ObjectSet(name,OBJPROP_COLOR,col);
ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(name,OBJPROP_TIME1,time1);
ObjectSet(name,OBJPROP_TIME2,time2);
ObjectSet(name,OBJPROP_PRICE1,price1);
ObjectSet(name,OBJPROP_PRICE2,price2);
ObjectSet(name,OBJPROP_RAY,ray);

if(ObjectFind(name)==window)return(true);
return(false);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Draw Closed Orders |
//+------------------------------------------------------------------+
void DrawMaxDrawdown()
{
int history=OrdersHistoryTotal();
if(Draw_Drawdown_for_Closed_Orders && history!=OrdersHistory)
{
for(int i=history-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY) && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()<=OP_SELL)
{
if(OrderType()==OP_BUY)
{
int orderBuyCandles = ( (OrderCloseTime() - OrderOpenTime())/60 )/Period();
double LowestCandle = NormalizeDouble( iLow(NULL,0,iLowest(NULL,0,MODE_LOW,orderBuyCandles,orderBuyCandles) ), Digits);
Print ("(",OrderCloseTime() - OrderOpenTime(),"), Order #",OrderTicket()," (",OrderType(),"), OTime: ",TimeToString (OrderOpenTime(),TIME_DATE|TIME_MINUTES),", Buy Candles: ",orderBuyCandles, ", Lowest Candle: ",LowestCandle,", Lowest Candle Time: ", TimeToString(iTime(NULL,0,iLowest(NULL,0,MODE_LOW,orderBuyCandles,orderBuyCandles)),TIME_DATE|TIME_MINUTES
) );
CreateTLine(OrderTicket(),Aqua,OrderOpenTime(),OrderOpenPrice(),iTime(NULL,0,iLowest(NULL,0,MODE_LOW,orderBuyCandles,orderBuyCandles)),LowestCandle,false);
}
if(OrderType()==OP_SELL)
{
int orderSellCandles = ( (OrderCloseTime() - OrderOpenTime())/60 )/Period();
double HighestCandle = NormalizeDouble( iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,orderSellCandles,orderSellCandles) ), Digits);
Print ("(",OrderCloseTime() - OrderOpenTime(),"), Order #",OrderTicket()," (",OrderType(),"), OTime: ",TimeToString (OrderOpenTime(),TIME_DATE|TIME_MINUTES),", Sell Candles: ",orderSellCandles, ", Highest Candle: ",HighestCandle,", Highest Candle Time: ", TimeToString ( iTime(NULL,0,iHighest(NULL,0,MODE_HIGH,orderSellCandles,orderSellCandles)), TIME_DATE|TIME_MINUTES ) );
CreateTLine(OrderTicket(),Red,OrderOpenTime(),OrderOpenPrice(),iTime(NULL,0,iHighest(NULL,0,MODE_HIGH,orderSellCandles,orderSellCandles)),HighestCandle,false);
}
}

}
OrdersHistory=history;
}
}
//+------------------------------------------------------------------+
//| End of Draw Closed Orders |
//+------------------------------------------------------------------+
 

Вложения

  • EURUSDproDaily.png
    EURUSDproDaily.png
    298,5 КБ · Просмотры: 43
Последнее редактирование:

planod

Интересующийся
Доброго времени суток. Подскажите, как можно посчитать длину бара (от максимума до минимума) в пунктах?
 

Lender

Активный участник
Доброго времени суток. Подскажите, как можно посчитать длину бара (от максимума до минимума) в пунктах?

PHP:
int bar = 1;
double barSize1 = High[bar]-Low[bar]; 
  // пример:  1.2237-1.2230 = 0.0007
int barSize2=(High[bar]-Low[bar])/Point;
  // пример:  (1.2237-1.2230)/0.0001 = 7
 
Последнее редактирование:

planod

Интересующийся
Lender и ansol
спасибо большое за разъяснения, но я добавил еще NormalizeDouble до 0
 

ansol

Местный знаток
Lender и ansol
спасибо большое за разъяснения, но я добавил еще NormalizeDouble до 0

Гм! Если переменная имеет тип "целое"/int, то ничего добавлять не надо - она дробной уже никогда не станет :) в крайнем случает к результату можно применить оператор (int)
PHP:
points = (int)(High[0]-Low[0])/Point;
или
points = int( (High[0]-Low[0])/Point );
 

Milord

Местный знаток
...я конечно понимаю, что тогда погорячился.. но просто уже нервы были на пределе) я 2 дня далбаюсь с этим кодом) не хотел..

Юрий не хочу вас ничем обидеть, просто запаситесь терпением на месяц , а лучше на полгодика-год, а вы хотели наскоком за 2 дня освоить язык MQL4, и уже писать граальные совы?:facepalm:
я помню как сидел сутками над справкой по языку и кодом самого простого советника, не желая чтобы он приносил профит, а хотя бы открывал ордера, и никаких индикаторов внешних не брал, все проще и сложнее одновременно, в языке уже прописаны десятки индикаторов, внешние индюки вапще можно не использовать... удачи вам и терпения!
 
Верх