Вопрос MQL - страница 2

 
Seric29:
А что он может быть меньше 0. Ценовая динамика не может носить отрицательный характер.

это не ценовая динамика, а ордерная)

тикет - это номер сделки, который присвоил ваш брокер, если этот номер -1, значит сделка не состоялась

 
hjkweq:

это не ценовая динамика, а ордерная)

тикет - это номер сделки, который присвоил ваш брокер, если этот номер -1, значит сделка не состоялась

понятно. В справочнике не всё указано и показано. Тем кто не знаком с языками программирования сложно будет самому это всё рассчитывать и составлять код, хоть там и написано что это легко. 

 

Хочу написать советника который будет торговать в канале фибоначчи, случайно нашёл этот код. Код вставлял в компилятор MetaEditor компилируется на удивление без ошибок но этот код ничего не делает робот из него не получается возможно что все значения нулевые. Хочу спросить можно ли его использовать как основу для советника? Также хотел бы поинтересоваться какие пункты из этого кода можно выкинуть например 1. Приоритет на нажатие мышью для чего этот бред в коде или 2.Скрыт в списке объектов, 3.сбросим значение ошибки это обязательно в коде 

? Кто может подробнее разъяснить написанный код?

#property strict 
//--- описание 
#property description "Скрипт строит графический объект \"Канал Фибоначчи\"." 
#property description "Координаты точек привязки задаются в процентах от" 
#property description "размеров окна графика." 
//--- покажем окно входных параметров при запуске скрипта 
#property script_show_inputs 
//--- входные параметры скрипта 
input string          InpName="FiboChannel";     // Имя канала 
input int             InpDate1=20;               // Дата 1-ой точки в % 
input int             InpPrice1=10;              // Цена 1-ой точки в % 
input int             InpDate2=60;               // Дата 2-ой точки в % 
input int             InpPrice2=30;              // Цена 2-ой точки в % 
input int             InpDate3=20;               // Дата 3-ей точки в % 
input int             InpPrice3=25;              // Цена 3-ей точки в % 
input color           InpColor=clrRed;           // Цвет канала 
input ENUM_LINE_STYLE InpStyle=STYLE_DASHDOTDOT; // Стиль линий канала 
input int             InpWidth=1;                // Толщина линий канала 
input bool            InpBack=false;             // Канал на заднем плане 
input bool            InpSelection=true;         // Выделить для перемещений 
input bool            InpRay=false;              // Продолжение канала на весь график
 input bool            InpHidden=true;            // Скрыт в списке объектов 
input long            InpZOrder=0;               // Приоритет на нажатие мышью 
//+------------------------------------------------------------------+ 
//| Cоздает "Канал Фибоначчи" по заданным координатам                | 
//+------------------------------------------------------------------+ 
bool FiboChannelCreate(const long            chart_ID=0,         // ID графика 
                       const string          name="FiboChannel", // имя канала 
                       const int             sub_window=0,       // номер подокна 
                        datetime              time1=0,            // время первой точки
                        double                price1=0,           // цена первой точки
                        datetime              time2=0,            // время второй точки
                        double                price2=0,           // цена второй точки
                        datetime              time3=0,            // время третьей точки
                        double                price3=0,           // цена третьей точки
                        const color           clr=clrRed,         // цвет канала
                        const ENUM_LINE_STYLE style=STYLE_SOLID,  // стиль линий канала
                        const int             width=1,            // толщина линий канала
                        const bool            back=false,         // на заднем плане
                        const bool            selection=true,     // выделить для перемещений
                        const bool            ray=false,          // продолжение канала на весь график
                        const bool            hidden=true,        // скрыт в списке объектов
                        const long            z_order=0)          // приоритет на нажатие мышью
   { 
//--- установим координаты точек привязки, если они не заданы 
   ChangeFiboChannelEmptyPoints(time1,price1,time2,price2,time3,price3); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- создадим канал по заданным координатам 
   if(!ObjectCreate(chart_ID,name,OBJ_FIBOCHANNEL,sub_window,time1,price1,time2,price2,time3,price3))
      { 
      Print(__FUNCTION__, 
            ": не удалось создать \"Канал Фибоначчи\"! Код ошибки = ",GetLastError());
       return(false); это условия обязательно
     } 
//--- установим цвет канала 
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr); 
//--- установим стиль линий канала 
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style); 
//--- установим толщину линий канала 
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width); 
//--- отобразим на переднем (false) или заднем (true) плане 
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back); 
//--- включим (true) или отключим (false) режим выделения канала для перемещений
 //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
 //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection 
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection); 
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection); 
//--- включим (true) или отключим (false) режим продолжения отображения канала на весь график
    ObjectSetInteger(chart_ID,name,OBJPROP_RAY,ray); 
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
    ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden); 
//--- установим приоритет на получение события нажатия мыши на графике 
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order); 
//--- успешное выполнение 
   return(true); этот весь блок тоже нужен не нужен
  } 
//+------------------------------------------------------------------+ 
//| Задает количество уровней и их параметры                         | 
//+------------------------------------------------------------------+ 
bool FiboChannelLevelsSet(int             levels,             // количество линий уровня
                           double          &values[],          // значения линий уровня
                           color           &colors[],          // цвет линий уровня
                           ENUM_LINE_STYLE &styles[],          // стиль линий уровня
                           int             &widths[],          // толщина линий уровня
                           const long      chart_ID=0,         // ID графика 
                          const string    name="FiboChannel") // имя объекта 
  { 
//--- проверим размеры массивов 
   if(levels!=ArraySize(colors) || levels!=ArraySize(styles) || 
      levels!=ArraySize(widths) || levels!=ArraySize(widths)) 
     { 
      Print(__FUNCTION__,": длина массива не соответствует количеству уровней, ошибка!");
       return(false); 
     } 
//--- установим количество уровней 
   ObjectSetInteger(chart_ID,name,OBJPROP_LEVELS,levels); 
//--- установим свойства уровней в цикле 
   for(int i=0;i<levels;i++) 
     { 
      //--- значение уровня 
      ObjectSetDouble(chart_ID,name,OBJPROP_LEVELVALUE,i,values[i]); 
      //--- цвет уровня 
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELCOLOR,i,colors[i]); 
      //--- стиль уровня 
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELSTYLE,i,styles[i]); 
      //--- толщина уровня 
      ObjectSetInteger(chart_ID,name,OBJPROP_LEVELWIDTH,i,widths[i]); 
      //--- описание уровня 
      ObjectSetString(chart_ID,name,OBJPROP_LEVELTEXT,i,DoubleToString(100*values[i],1));
      } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Перемещает точку привязки "Канала Фибоначчи"                     | 
//+------------------------------------------------------------------+ 
bool FiboChannelPointChange(const long   chart_ID=0,         // ID графика 
                            const string name="FiboChannel", // имя канала 
                            const int    point_index=0,      // номер точки привязки
                             datetime     time=0,             // координата времени точки привязки
                             double       price=0)            // координата цены точки привязки
   { 
//--- если координаты точки не заданы, то перемещаем ее на текущий бар с ценой Bid
    if(!time) 
      time=TimeCurrent(); 
   if(!price) 
      price=SymbolInfoDouble(Symbol(),SYMBOL_BID); 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- переместим точку привязки 
   if(!ObjectMove(chart_ID,name,point_index,time,price)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось переместить точку привязки! Код ошибки = ",GetLastError()); или это условие
       return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Удаляет канал                                                    | 
//+------------------------------------------------------------------+ 
bool FiboChannelDelete(const long   chart_ID=0,         // ID графика 
                       const string name="FiboChannel") // имя канала 
  { 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- удалим канал 
   if(!ObjectDelete(chart_ID,name)) 
     { 
      Print(__FUNCTION__, 
            ": не удалось удалить \"Канал Фибоначчи\"! Код ошибки = ",GetLastError());
       return(false); 
     } 
//--- успешное выполнение 
   return(true); 
  } 
//+------------------------------------------------------------------+ 
//| Проверяет значения точек привязки "Канала Фибоначчи" и для       | 
//| пустых значений устанавливает значения по умолчанию              | 
//+------------------------------------------------------------------+ 
void ChangeFiboChannelEmptyPoints(datetime &time1,double &price1,datetime &time2,
                                   double &price2,datetime &time3,double &price3)
   { 
//--- если время второй (правой) точки не задано, то она будет на текущем баре 
   if(!time2) 
      time2=TimeCurrent(); 
//--- если цена второй точки не задана, то она будет иметь значение Bid 
   if(!price2) 
      price2=SymbolInfoDouble(Symbol(),SYMBOL_BID); 
//--- если время первой (левой) точки не задано, то она лежит на 9 баров левее второй
    if(!time1) 
     { 
      //--- массив для приема времени открытия 10 последних баров 
      datetime temp[10]; 
      CopyTime(Symbol(),Period(),time2,10,temp); 
      //--- установим первую точку на 9 баров левее второй 
      time1=temp[0]; 
     } 
//--- если цена первой точки не задана, то сдвинем ее на 300 пунктов выше второй
    if(!price1) 
      price1=price2+300*SymbolInfoDouble(Symbol(),SYMBOL_POINT); 
//--- если время третьей точки не задано, то оно совпадает с временем первой точки
    if(!time3) 
      time3=time1; 
//--- если цена третьей точки не задана, то она совпадает с ценой второй точки 
   if(!price3) 
      price3=price2; 
  } 
//+------------------------------------------------------------------+ 
//| Script program start function                                    | 
//+------------------------------------------------------------------+ 
void OnStart() 
  { 
//--- проверим входные параметры на корректность 
   if(InpDate1<0 || InpDate1>100 || InpPrice1<0 || InpPrice1>100 ||  
      InpDate2<0 || InpDate2>100 || InpPrice2<0 || InpPrice2>100 ||  
      InpDate3<0 || InpDate3>100 || InpPrice3<0 || InpPrice3>100) 
     { 
      Print("Ошибка! Некорректные значения входных параметров!"); 
      return; 
     } 
//--- количество видимых баров в окне графика 
   int bars=(int)ChartGetInteger(0,CHART_VISIBLE_BARS); 
//--- размер массива price 
   int accuracy=1000; 
//--- массивы для хранения значений дат и цен, которые будут использованы 
//--- для установки и изменения координат точек привязки канала 
   datetime date[]; 
   double   price[]; 
//--- выделение памяти 
   ArrayResize(date,bars); 
   ArrayResize(price,accuracy); 
//--- заполним массив дат 
   ResetLastError(); 
   if(CopyTime(Symbol(),Period(),0,bars,date)==-1) 
     { 
      Print("Не удалось скопировать значения времени! Код ошибки = ",GetLastError());
       return; 
     } 
//--- заполним массив цен 
//--- найдем максимальное и минимальное значение графика 
   double max_price=ChartGetDouble(0,CHART_PRICE_MAX); 
   double min_price=ChartGetDouble(0,CHART_PRICE_MIN); 
//--- определим шаг изменения цены и заполним массив 
   double step=(max_price-min_price)/accuracy; 
   for(int i=0;i<accuracy;i++) 
      price[i]=min_price+i*step; 
//--- определим точки для рисования канала 
   int d1=InpDate1*(bars-1)/100; 
   int d2=InpDate2*(bars-1)/100; 
   int d3=InpDate3*(bars-1)/100; 
   int p1=InpPrice1*(accuracy-1)/100; 
   int p2=InpPrice2*(accuracy-1)/100; 
   int p3=InpPrice3*(accuracy-1)/100; 
//--- создадим "Канал Фибоначчи" 
   if(!FiboChannelCreate(0,InpName,0,date[d1],price[p1],date[d2],price[p2],date[d3],price[p3],
       InpColor,InpStyle,InpWidth,InpBack,InpSelection,InpRay,InpHidden,InpZOrder))
      { 
      return; 
     } 
//--- перерисуем график и подождем 1 секунду 
   ChartRedraw(); 
   Sleep(1000); 
//--- теперь будем перемещать точки привязки канала 
//--- счетчик цикла 
   int h_steps=bars/10; 
//--- перемещаем первую точку привязки 
   for(int i=0;i<h_steps;i++) 
     { 
      //--- возьмем следующее значение 
      if(d1>1) 
         d1-=1; 
      //--- сдвигаем точку 
      if(!FiboChannelPointChange(0,InpName,0,date[d1],price[p1])) 
         return; 
      //--- проверим факт принудительного завершения скрипта 
      if(IsStopped()) 
         return; 
      //--- перерисуем график 
      ChartRedraw(); 
      // задержка в 0.05 секунды 
      Sleep(50); 
     } 
//--- задержка в 1 секунду 
   Sleep(1000); 
//--- счетчик цикла 
   int v_steps=accuracy/10; 
//--- перемещаем вторую точку привязки 
   for(int i=0;i<v_steps;i++) 
     { 
      //--- возьмем следующее значение 
      if(p2>1) 
         p2-=1; 
      //--- сдвигаем точку 
      if(!FiboChannelPointChange(0,InpName,1,date[d2],price[p2])) 
         return; 
      //--- проверим факт принудительного завершения скрипта а эта запись нужна?
      if(IsStopped()) 
         return; 
      //--- перерисуем график 
      ChartRedraw(); 
     } 
//--- задержка в 1 секунду 
   Sleep(1000); 
//--- счетчик цикла 
   v_steps=accuracy/15; 
//--- перемещаем третью точку привязки 
   for(int i=0;i<v_steps;i++) 
     { 
      //--- возьмем следующее значение 
      if(p3<accuracy-1) 
         p3+=1; 
      //--- сдвигаем точку 
      if(!FiboChannelPointChange(0,InpName,2,date[d3],price[p3])) 
         return; 
      //--- проверим факт принудительного завершения скрипта 
      if(IsStopped()) 
         return; 
      //--- перерисуем график 
      ChartRedraw(); 
     } 
//--- задержка в 1 секунду 
   Sleep(1000); 
//--- удалим канал с графика 
   FiboChannelDelete(0,InpName); 
   ChartRedraw(); 
//--- задержка в 1 секунду 
   Sleep(1000); 
//--- 
  }
 
Seric29:

Хочу написать советника который будет торговать в канале фибоначчи, случайно нашёл этот код. Код вставлял в компилятор MetaEditor компилируется на удивление без ошибок но этот код ничего не делает робот из него не получается возможно что все значения нулевые. Хочу спросить можно ли его использовать как основу для советника? Также хотел бы поинтересоваться какие пункты из этого кода можно выкинуть например 1. Приоритет на нажатие мышью для чего этот бред в коде или 2.Скрыт в списке объектов, 3.сбросим значение ошибки это обязательно в коде 

? Кто может подробнее разъяснить написанный код?

Если посмотрите на приведенный Вами текст якобы советника - то найдете там слова: Скрипт строит графический объект ... Это скрипт. Для торговли желателен советник, в котором, с другой стороны, должна использоваться функция OrderSend для посылки на сервер ордеров ( по-нашему приказов). Без знания основ программирования браться за программу - это что пытаться научить говорить безъязычное существо вроде инфузории или амебы, или дождевого червяка. Есть люди, занимающиеся тут программированием 5 ... 10 лет прежде чем что-то начало получаться.

Совет: скачайте с КодеБазы десятка два советников, погоняйте в тестере стратегий. Найдете отдаленно похожий на доходного (критерий: проигрыш всего в 2 раза превышает выигрыш) и погоняйте его на демо-счете. Потом уже смотрите его в редакторе.

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

 
Seric29:

В этой теме я буду задавать вопросы по данному языку и по некоторым кодам. 

https://book.mql4.com/ru/build/conditions

Функция вычисляет торговые критерии. Функция возвращает следующие значения:

10 - сработал торговый критерий для открытия рыночного ордера Buy;
20 - сработал торговый критерий для открытия рыночного ордера Sell; 
11 - сработал торговый критерий для закрытия рыночного ордера Buy;
21 - сработал торговый критерий для закрытия рыночного ордера Sell;

почему так зациклена программа на возвращаемых значениях для чего так сделано?

Такой вариант автора - программа не зациклена абсолютно. Это общий вариант по мнению Автора: 

https://book.mql4.com/ru/build/trading - внимание обратите на зачения по выбору торговой ф-ии  и все станет понятно. Числа могут быть любыми - это лишь вариант Сергея Ковалева. Благодарность ему выражаю от всей души - по его учебнику учился...

int Trade(int Trad_Oper)              // Пользовательская функция
  {
   // Trad_Oper - тип торговой операции:
   // 10 - открытие Buy  
   // 20 - открытие Sell 
   // 11 - закрытие Buy
   // 21 - закрытие Sell
   //  0 - значимых критериев нет
   // -1 - используется другой финансовый инструмент
   switch(Trad_Oper)
     {
      //--------------------------------------------------------- 2 --
      case 10:                         // Торговый критерий = Buy
         Close_All(1);                 // Закрыть все Sell
         if (Lot()==false)             // Средств не хватает на миним.
            return;                    // Выход из пользов. функции
         Open_Ord(0);                  // Открыть Buy
         return;                       // Поторговали - уходим

...

Торговые функции - Создание обычной программы - Учебник по MQL4
Торговые функции - Создание обычной программы - Учебник по MQL4
  • book.mql4.com
Как правило, обычный эксперт содержит несколько торговых функций. Их можно разделить на две категории - управляющие и исполнительные. В большинстве случаев в эксперте используется всего одна управляющая функция и несколько исполнительных. Торговая стратегия в обычном эксперте реализуется на основе двух функций - функции определения торговых...
 
STARIJ:

Если посмотрите на приведенный Вами текст якобы советника - то найдете там слова: Скрипт строит графический объект ... Это скрипт. Для торговли желателен советник, в котором, с другой стороны, должна использоваться функция OrderSend для посылки на сервер ордеров ( по-нашему приказов). Без знания основ программирования браться за программу - это что пытаться научить говорить безъязычное существо вроде инфузории или амебы, или дождевого червяка. Есть люди, занимающиеся тут программированием 5 ... 10 лет прежде чем что-то начало получаться.

Совет: скачайте с КодеБазы десятка два советников, погоняйте в тестере стратегий. Найдете отдаленно похожий на доходного (критерий: проигрыш всего в 2 раза превышает выигрыш) и погоняйте его на демо-счете. Потом уже смотрите его в редакторе.

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

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

 
Как указать в коде советника что должно быть открыто 3 ордера?
 
Seric29:
Как указать в коде советника что должно быть открыто 3 ордера?
if(OrdersTotal()<=3)
   {
   //что-то делаем
   }

Имейте в виду что функция ( OrdersTotal() ) видит все ордера, любые магики, другие символы,отложенные и рыночные

 

Привет, из солнечного Мурманска. Пришел за помощью. Как бы мне сигналить на экран с интервалом кратным 60 минут от закрытия ордера. информацию сигналить такую, лот, время закрытия ордера и цену закрытия. Те ордеры что закрыты не боле 10 часов.

 
PolarSeaman:

Привет, из солнечного Мурманска. Пришел за помощью. Как бы мне сигналить на экран с интервалом кратным 60 минут от закрытия ордера. информацию сигналить такую, лот, время закрытия ордера и цену закрытия. Те ордеры что закрыты не боле 10 часов.

Решение = советник. Другие названия: робот, помощник, эксперт, АТС = автоматическая торговая система, МТС = механическая торговая система, жаргонное словечко сова. При запуске советника на экране появляются 2 кнопки. 1. Выход - прекращает работу советника. 2. Разрешение/Запрет работы советника. Советник работает так: По таймеру с интервалом 1 минуту, если разрешено, производится анализ истории торговли. Если есть ордер, от закрытия которого прошло 60 минут но менее 10 часов, то выводится лот, время и цена закрытия этого ордера. Этапы проектирования:

Вариант 0. При нажатии Кнопка 1 меняет цвет. При нажатии Кнопки 2 - выход. Цель - проверка работы кнопок

Вариант 1. Советник каждую минуту выводит на экран текущее время. Назначение - контроль отсчета 1 минуты

Вариант 2. Советник каждую минуту выводит на экран количество ордеров в истории. Назначение - контроль доступа к истории. Убеждаемся, что количество ордеров в истории зависит от установленного в истории периода: Сегодня, Последние 3 дня, Последняя неделя, ...

Вариант 3. Советник каждую минуту выводит на экран время закрытия последних трех ордеров. Назначение - контроль цикла

Вариант 4. Советник каждую минуту проверяет историю и при совпадении условий выводит информацию об ордерах

Файлы:
TwoButton.mq4  8 kb