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

eevviill

Заблокирован
Василий, тут вариантов несколько, но не полная информация для правильного решения.
Можно расставить последовательность команд в определённой последовательности так чтобы сначала закрылись ордера, переключить флаг и реверс, а потом открывать ордера.
Или можно в цикле закрытия ордеров проверять наличие в OrderComment() строки REVERS.
Здравствуйте. А какя ещё нужна информация? Я про советник DC.
 

eevviill

Заблокирован
Мне по большому счёту нужно чтобы после выполнения условия некоторые операции выполнились один раз и всё.
 

AlexeyVik

Программист mql4 mql5
Здравствуйте. А какя ещё нужна информация? Я про советник DC.
Я понял, что о нём речь. Потому и сказал о комментарии ордера.
Мне по большому счёту нужно чтобы после выполнения условия некоторые операции выполнились один раз и всё.
А вот это как-раз и не понятно. Вариантов слишком много. Включай скайп, разберёмся.
 
Здравствуйте! Помогите с написанием скрипта пожалуйста:
HTML:
bool Result1=1;
  for (int i=0; i<OrdersTotal(); i++)         
     {
      if (OrderSelect(i,SELECT_BY_POS)
        {
         if Result1=((OrderMagicNumber()==Magic1) && (OrderType()>1)) //A
           {
             if (Result1==0)     //B
                {
                     OrderSend(Symbol(),OP_BUYSTOP... и т.д
Суть такова: Если находится ордер А, то ордер ниже НЕ должен выставляться!
И наоборот - если ордер со значением А не находится, то сделка открывается!
PS: В строке B я вообще не соображаю, что писать, так что не серчайте на ошибки) Если можно, то напишите пожалуйста скрипт с пояснениями чтобы понимать!
 

Ugar

Гуру форума
Здравствуйте! Помогите с написанием скрипта пожалуйста:
HTML:
bool Result1=1;
  for (int i=0; i<OrdersTotal(); i++)         
     {
      if (OrderSelect(i,SELECT_BY_POS)
        {
         if Result1=((OrderMagicNumber()==Magic1) && (OrderType()>1)) //A
           {
             if (Result1==0)     //B
                {
                     OrderSend(Symbol(),OP_BUYSTOP... и т.д
Суть такова: Если находится ордер А, то ордер ниже НЕ должен выставляться!
И наоборот - если ордер со значением А не находится, то сделка открывается!
PS: В строке B я вообще не соображаю, что писать, так что не серчайте на ошибки) Если можно, то напишите пожалуйста скрипт с пояснениями чтобы понимать!
Код:
bool Result1=true;
  for (int i=0; i<OrdersTotal(); i++)         
     {
      if (OrderSelect(i,SELECT_BY_POS[B][COLOR=Red],MODE_TRADES[/COLOR][/B])
        {
        [B][COLOR=Red] if((OrderMagicNumber()==Magic1) && (OrderType()>1))Result1=false;//A
        }
      }[/COLOR][/B]
[B][COLOR=Red]if (Result1) [/COLOR][/B]OrderSend(Symbol(),OP_BUYSTOP... и т.д
 

eevviill

Заблокирован
Здравствуйте! Помогите с написанием скрипта пожалуйста:
HTML:
bool Result1=1;
  for (int i=0; i<OrdersTotal(); i++)         
     {
      if (OrderSelect(i,SELECT_BY_POS)
        {
         if Result1=((OrderMagicNumber()==Magic1) && (OrderType()>1)) //A
           {
             if (Result1==0)     //B
                {
                     OrderSend(Symbol(),OP_BUYSTOP... и т.д
Суть такова: Если находится ордер А, то ордер ниже НЕ должен выставляться!
И наоборот - если ордер со значением А не находится, то сделка открывается!
PS: В строке B я вообще не соображаю, что писать, так что не серчайте на ошибки) Если можно, то напишите пожалуйста скрипт с пояснениями чтобы понимать!
Не знаю что ты конкретно имеешь ввиду, но возможно тебе поможет команда break. Она отсанавливает цыкл.

PHP:
bool order2_open=false;
for (int i=0; i<OrdersTotal(); i++)         
     {
      if (OrderSelect(i,SELECT_BY_POS)
        {
          if ((OrderMagicNumber()==Magic1) && (OrderType()>1))
 order2_open=true;
break;
}
}
 

SlavaR

Активный участник
Помогите!

Здравствуйте.
Помогите пожалуйста, с написанием работы кода советника.
Должен работать так: сначала выставляются байстоп и селстоп ордера. Как цена достигла одного из ник, и стала рыночной, второй, убирается, и на его место должен выстаиться удвоенный. А получается постоянное удаление и установка этого ордера, потому что незнаю, как прописать ещё одно нужное условие, ну например удаление по тикету.
Вот код:
Заранее всем премного благодарен, осообенно eevviill за то что сподвиг на это и за его уроки продолжай - надо .

[FONT=&quot]
PHP:
 //+------------------------------------------------------------------+
//|            модуль установки   ордеров                            |
//+------------------------------------------------------------------+
   if (li_64 == 0 && li_68 == 0 && ld_24 > MaxLoss) {    //если 
      price_112 = NormalizeDouble(Ask + FirstStep * Point, Digits);  // то цена = 
      if (li_56 == 0 ||price_112 < NormalizeDouble(ld_76 - FirstStep * Point, Digits)) {
         if (li_56 == 0) lots_120 = lot; // если li_56(бай) не изменилось то лот равен условленному
               OrderSend(Symbol(), OP_BUYSTOP, lots_120, price_112, 3, 0, 0, " TStopOrd_T BuyS", Magic, 0, Blue); //посылаем ордер  
      }
   }
      
      if (cmd_72 == OP_SELL  && li_60 != 0) {    //если 
      price_112 = NormalizeDouble(Ask + FirstStep * Point, Digits);  // то цена = 
      if (cmd_72 == OP_SELL || price_112 < NormalizeDouble(ld_76 - FirstStep * Point, Digits)) {
         if (li_60 != 0 && cmd_72 == OP_SELL )lots_120 = lot * MathPow(K_Lot, li_60) + li_60 * PlusLot; //иначе lot_120 = 
         OrderSend(Symbol(), OP_BUYSTOP, lots_120, price_112, 3, 0, 0, "TStopOrd_T BuyS ", Magic, 0, Blue); //посылаем ордер
         }
     }  
    
      if (li_68 == 0 && li_64 == 0 && ld_16 > MaxLoss)  {    //если 
       price_112 = NormalizeDouble(Bid - FirstStep * Point, Digits);   // то цена = 
      if (li_60 == 0 || price_112 > NormalizeDouble(ld_100 + FirstStep * Point, Digits)) {
         if (li_60 == 0) lots_120 = lot; // если li_60 sell не изменилось то лот равен условленному
               OrderSend(Symbol(), OP_SELLSTOP, lots_120, price_112, 3, 0, 0, " TStopOrd_T SellS", Magic, 0, Red); //посылаем ордер                
      }
   } 
       
       if (cmd_72 == OP_BUY  && li_56 != 0) {     //если
      price_112 = NormalizeDouble(Bid - FirstStep * Point, Digits);  
      if (cmd_72 == OP_BUY || price_112 > NormalizeDouble(ld_100 + FirstStep * Point, Digits)) {
         if (li_56 != 0 && cmd_72 == OP_BUY) lots_120 = lot * MathPow(K_Lot, li_56) + li_56 * PlusLot; //иначе lot_120 =
         OrderSend(Symbol(), OP_SELLSTOP, lots_120, price_112, 3, 0, 0, " TStopOrd_T SellS", Magic, 0, Red); //посылаем ордер
       }
   } 
   
 
if (cmd_72 == OP_BUYSTOP && li_60 == 1  || lots_120 == lot)OrderDelete(OrderTicket());
 if (cmd_72 == OP_SELLSTOP && li_56 == 1  || lots_120 == lot)OrderDelete(OrderTicket());
[/FONT]
 

AlexeyVik

Программист mql4 mql5
Здравствуйте.
Помогите пожалуйста, с написанием работы кода советника.
Должен работать так: сначала выставляются байстоп и селстоп ордера. Как цена достигла одного из ник, и стала рыночной, второй, убирается, и на его место должен выстаиться удвоенный. А получается постоянное удаление и установка этого ордера, потому что незнаю, как прописать ещё одно нужное условие, ну например удаление по тикету.
Вот код:
Заранее всем премного благодарен, осообенно eevviill за то что сподвиг на это и за его уроки продолжай - надо .
Читать декомпил не по-мне. А на вопрос ответить могу.
В этом случае надо добавить условие наличия противоположного ордера. На человеческом языке так: если ордера бай нету и ордера селстоп нету то поставим ордер селстоп со стартовым лотом, а если есть то удалим селстоп и поставим ордер селстоп с удвоенным лотом.
 

SlavaR

Активный участник
Читать декомпил не по-мне. А на вопрос ответить могу.
В этом случае надо добавить условие наличия противоположного ордера. На человеческом языке так: если ордера бай нету и ордера селстоп нету то поставим ордер селстоп со стартовым лотом, а если есть то удалим селстоп и поставим ордер селстоп с удвоенным лотом.

Данное условие я прописывал, именно с начальным лотом, но почему-то оно не работает. То есть я прописал переменную [FONT=&quot]ob_1 [/FONT] = начальному лоту и вставил в код причем в разные места и делал её и булиан как, сейчас, и дабл, всё равно не удалят.
PHP:
  if (cmd_72 == OP_BUYSTOP && li_60 == 1 && ob_1 == (true))OrderDelete(OrderTicket());
эта строка звучит так, если есть байстоп и сел с начальным лотом, то удаляем стоп ордер. Я к тому, что это условие я писал, но именно когда прописываешь начальный лот, код перестаёт удалять ордер
пипец какойто :(
 
Последнее редактирование:

AlexeyVik

Программист mql4 mql5
Данное условие я прописывал, именно с начальным лотом, но почему-то оно не работает. То есть я прописал переменную [FONT=&quot]ob_1 [/FONT] = начальному лоту и вставил в код причем в разные места и делал её и булиан как, сейчас, и дабл, всё равно не удалят.
PHP:
  if (cmd_72 == OP_BUYSTOP && li_60 == 1 && ob_1 == (true))OrderDelete(OrderTicket());
эта строка звучит так, если есть байстоп и сел с начальным лотом, то удаляем стоп ордер. Я к тому, что это условие я писал, но именно когда прописываешь начальный лот, код перестаёт удалять ордер
пипец какойто :(
Чтобы удалить стоп. ордер или закрыть рыночный его нужно выбрать функцией OrderSelect() проверить его тип, символ, желательно магик, определить тикет и только потом писать OrderDelete(OrderTicket());
А с какого будуна тебе пришло в голову объявить булеву переменную и присвоить ей размер лота???
Ведь в таком случае если лот будет больше 0, не важно сколько, будет true, начальный лот или конечный компу по-барабану.
 

SlavaR

Активный участник
Чтобы удалить стоп. ордер или закрыть рыночный его нужно выбрать функцией OrderSelect() проверить его тип, символ, желательно магик, определить тикет и только потом писать OrderDelete(OrderTicket());
А с какого будуна тебе пришло в голову объявить булеву переменную и присвоить ей размер лота???
Ведь в таком случае если лот будет больше 0, не важно сколько, будет true, начальный лот или конечный компу по-барабану.

сделаю
Благодарю.
 

hoz

Активный участник
Я занялся написанием индикатора. По сути на данный момент мне нужно, чтоб рисовалась линия по 2 точках на выбранной машке. Есс-но точки на машке будем выбирать по сдвигу N-баров назад.

На скрине показано, что я хочу нарисовать.


Есс-но я предположил, что нужно изначально найти это 2 точки на машке, по которым нужно рисовать линию.
Я это добавил в код:
PHP:
 double point1OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack1),   // Находим значение точек для...
           point2OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack2);   // отрисовки линии по ним.

Но потом когда начал писать функцию ObjectCreate у меня возникла мысль, что выходит эти значения тут как-бы не нужны.
Ведь в функции ObjectCreate нужно указывать время открытия и цену каждой точки, а точка на машке это другое. Из-за неопытности, т.к. пишу первый индикатор у меня неопределённости.
Т.к. мы рисует линии по машке, а iMA возвращает как я понимаю, цену на тот момент времени на сдвиге определённого бара. Как правильно это понять? Алгоритм не совсем понимаю.

По логике нужно писать так?
PHP:
ObjectCreate( string name, int type, int window, iTime(string symbol, int timeframe, shiftBarsBack1), double point1OfMa, iTime(string symbol, int timeframe, shiftBarsBack2), point2OfMa)

Про переменные point1OfMa и point2OfMa я уже упомянул выше, они укажут на цену на тот момент времени учитывая сдвиг на машке на shiftBarsBack1 и shiftBarsBack2.
А время уже возьмём из массива времени Time[] через функцию iTime(string symbol, int timeframe, shift), потому что у них будет разные сдвиги т.е. параметр shiftBarsBack1 и shiftBarsBack2.
Верно?
 
Последнее редактирование:

Ugar

Гуру форума
Я занялся написанием индикатора. По сути на данный момент мне нужно, чтоб рисовалась линия по 2 точках на выбранной машке. Есс-но точки на машке будем выбирать по сдвигу N-баров назад.

На скрине показано, что я хочу нарисовать.


Есс-но я предположил, что нужно изначально найти это 2 точки на машке, по которым нужно рисовать линию.
Я это добавил в код:
PHP:
 double point1OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack1),   // Находим значение точек для...
           point2OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack2);   // отрисовки линии по ним.
Но потом когда начал писать функцию ObjectCreate у меня возникла мысль, что выходит эти значения тут как-бы не нужны.
Ведь в функции ObjectCreate нужно указывать время открытия и цену каждой точки, а точка на машке это другое. Из-за неопытности, т.к. пишу первый индикатор у меня неопределённости.
Т.к. мы рисует линии по машке, а iMA возвращает как я понимаю, цену на тот момент времени на сдвиге определённого бара. Как правильно это понять? Алгоритм не совсем понимаю.

По логике нужно писать так?
PHP:
ObjectCreate( string name, int type, int window, iTime(string symbol, int timeframe, shiftBarsBack1), double point1OfMa, iTime(string symbol, int timeframe, shiftBarsBack2), point2OfMa)
Про переменные point1OfMa и point2OfMa я уже упомянул выше, они укажут на цену на тот момент времени учитывая сдвиг на машке на shiftBarsBack1 и shiftBarsBack2.
А время уже возьмём из массива времени Time[] через функцию iTime(string symbol, int timeframe, shift), потому что у них будет разные сдвиги т.е. параметр shiftBarsBack1 и shiftBarsBack2.
Верно?
Вроде верно. Единственное что создать объект мало. Нужно ещё задать ему свойства. Например цвет, тольщину, луч... Иначе линия может оказаться невидимой и уходящей в бесконечность.
 

hoz

Активный участник
Вот то, что есть на данный момент:

PHP:
extern string  h1 = "основные параметры машки";
extern int     maTF = 5;
extern int     maPeriod = 50;
extern int     maShiftByPrice = 0;
extern int     maMethod = 0;
extern int     maPrice = 0;
extern string  h2 = "===============================";

string         h3 = "значения shift для машки";
extern double         shiftBarsBack1 = 5;   // Первое значение shift.
extern double         shiftBarsBack2 = 10;  // Второе значение shift.
string         short_Name;
extern string  h4 = "===============================";

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DarkGreen
#property indicator_minimum 30
#property indicator_maximum -30
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
  // ArrayInitialize
   
  // -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {
    ObjectsDeleteAll(); // Очистим график от всего.
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
    double point1OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack1),   // Находим значение точек для...
           point2OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack2);   // отрисовки линии по ним.
    
    ObjectCreate("trendLine",OBJ_TREND,0,iTime(Symbol(),maTF,shiftBarsBack1),point1OfMa,iTime(Symbol(),maTF,shiftBarsBack2),point2OfMa);
    ObjectSet("trendLine",OBJPROP_COLOR,Black);
    ObjectSet("trendLine",OBJPROP_WIDTH,4);
    ObjectSet("trendLine",OBJPROP_STYLE,DRAW_SECTION);
    
   return(0);
  }


Получилось не то, что нужно. Хотя что-то получилось, что уже радует. Вот скрин:



Судя по скину линия рисуется не по тем точкам. А также она не имеет конца. По ходу это не отрезок, а прямая.
Есть недочёт какой-то?
 

Ugar

Гуру форума
Получилась не прямая, луч. Попробуй поменять флаг "луч". Для этого используй ObjectSet
 

hoz

Активный участник
В документации есть свойство объекта OBJPROP_RAY, которое позволяет Получать/устанавливать флаг свойства луч для объектов типа OBJ_TREND и ему подобных
Для свойства отрезок подобного не нашлось. Как быть тогда?

Через
PHP:
etIndexStyle(1,DRAW_SECTION);
я установил свойство линии в отрезок:

Вот что вышло:
PHP:
extern string  h1 = "основные параметры машки";
extern int     maTF = 5;
extern int     maPeriod = 50;
extern int     maShiftByPrice = 0;
extern int     maMethod = 0;
extern int     maPrice = 0;
extern string  h2 = "===============================";

string         h3 = "значения shift для машки";
extern double         shiftBarsBack1 = 5;   // Первое значение shift.
extern double         shiftBarsBack2 = 10;  // Второе значение shift.
string         short_Name;
extern string  h4 = "===============================";

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DarkGreen
#property indicator_minimum 30
#property indicator_maximum -30
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexStyle(1,DRAW_SECTION);
  // ArrayInitialize
   
  // -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {
    ObjectsDeleteAll(); // Очистим график от всего.
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
    double point1OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack1),   // Находим значение точек для...
           point2OfMa = iMA(Symbol(),maTF,maPeriod,maShiftByPrice,maMethod,maPrice,shiftBarsBack2);   // отрисовки линии по ним.
    
    ObjectCreate("trendLine",OBJ_TREND,0,iTime(Symbol(),maTF,shiftBarsBack2),point2OfMa,iTime(Symbol(),maTF,shiftBarsBack1),point1OfMa);
  //  ObjectSet("trendLine",OBJPROP_COLOR,Black);
  //  ObjectSet("trendLine",OBJPROP_WIDTH,4);
  //  ObjectSet("trendLine",OBJPROP_STYLE,DRAW_SECTION);
   // OBJ_TREND
    
   return(0);
  }
Но тем не менее, рисуется всё-равно луч.
 

Ugar

Гуру форума
После установки объекта добавь строчку
ObjectSet("trendLine",OBJPROP_RAY,false);

У меня же получается отрезки рисовать на индикаторе
divercci.gif
 
Последнее редактирование:

hoz

Активный участник
PHP:
ObjectSet("trendLine",OBJPROP_RAY,false);


Про дополнительный параметр false или true в функции ObjectSet в документации ни слова. Как это можно было узнать интересно?
 

Ugar

Гуру форума
PHP:
ObjectSet("trendLine",OBJPROP_RAY,false);
Про дополнительный параметр false или true в функции ObjectSet в документации ни слова. Как это можно было узнать интересно?

bool ObjectSet( string name, int prop_id, double value)Изменение значения указанного свойства объекта. В случае успеха функция возвращает TRUE, иначе FALSE. Для получения информации об ошибке необходимо вызвать функцию GetLastError().
См. также ObjectGet(). Параметры:
name - Имя объекта.
prop_id
- Идентификатор свойства объекта. Может быть любым из списка свойств объекта.
value - Новое значение указанного свойства.
От сюда следует что в prop_id задаётся идентификатор, а в value значение этого идентификатора.

OBJPROP_RAY 10 bool Получает/устанавливает флаг свойства луч для объектов типа OBJ_TREND и ему подобных
Здесь упоминается что это флаг, да и тип его указан bool.
А теперь вопрос, какие же значения может иметь флаг с типом bool?
 
Последнее редактирование:
Верх