Автор Тема: Пишу советника КАЧЕЛИ, нужна помощь  (Прочитано 2946 раз)

0 Пользователей и 1 Гость просматривают эту тему.

08 Август 2015, 19:05:16
Прочитано 2946 раз

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
Пишу советника по стратегии КАЧЕЛИ, нужна помощь.
Позже выложу ТЗ и алгоритм, а сейчас вопрос:

Чтобы редактировать открытый ордер, его сначала ОБЯЗАТЕЛЬНО нужно выбрать (OrderSelect), а уже потом можно его редактировать (OrderModify)
Я всё правильно понял?
________________________
Только что заметил, что в соседней теме davidd уже выложил ТЗ советника.
только не надо говорить, что стратегия плохая и сов убыточный, я его пишу для того, чтобы лучше понять язык MQL
________________________
Вот примерный алгоритм того, что я хочу

09 Август 2015, 17:52:38
Ответ #1

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Пишу советника по стратегии КАЧЕЛИ, нужна помощь.
Позже выложу ТЗ и алгоритм, а сейчас вопрос:

Чтобы редактировать открытый ордер, его сначала ОБЯЗАТЕЛЬНО нужно выбрать (OrderSelect), а уже потом можно его редактировать (OrderModify)
Я всё правильно понял?
________________________
Только что заметил, что в соседней теме davidd уже выложил ТЗ советника.
только не надо говорить, что стратегия плохая и сов убыточный, я его пишу для того, чтобы лучше понять язык MQL
________________________
Вот примерный алгоритм того, что я хочу
Выкладывайте код и Ваши рассуждения, по мере возможности помогу...
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

10 Август 2015, 18:35:42
Ответ #2

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
Выкладывать пока даже нечего, в день пишу по 3 строки кода, 4 из которых не правильные ;D

10 Август 2015, 19:22:16
Ответ #3

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
for(int i=OrdersTotal()-1; i>=0; i--)             
      if(OrderSelect(i,SELECT_BY_POS))               
Какой ордер тут выбирается? Последний открытый?
Про циклы сколько не читал и не смотрел, один фиг ничего не понятно.
Т.е. понятно как работает, перебирает ордера, пока i не будет больше или равно нулю. А перебирает с последнего открытого или с первого?

1. Ну и что это дало, то что все ордера перебрали?
2. Зачем после OrdersTotal() пишется -1

Просьба объяснить про циклы как ребенку лет пяти

10 Август 2015, 19:28:33
Ответ #4

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
for(int i=OrdersTotal()-1; i>=0; i--)             
      if(OrderSelect(i,SELECT_BY_POS))               
Какой ордер тут выбирается? Последний открытый?
Про циклы сколько не читал и не смотрел, один фиг ничего не понятно.
Т.е. понятно как работает, перебирает ордера, пока i не будет больше или равно нулю. А перебирает с последнего открытого или с первого?

1. Ну и что это дало, то что все ордера перебрали?
2. Зачем после OrdersTotal() пишется -1

Просьба объяснить про циклы как ребенку лет пяти
1 перебор в данном случае с самого старого
2 при переборе ордеров мы видим все данные о каждом ордере, видим все данные ...
3 в языке программирования все начинается с 0 , 0 1 2   цифры 3 но последняя два,  ордеров в терминале например 3  но в программе идет учет 0 1 2 и закончить мы должны на 2 а не на 3 в результате имеем 3-1
Я пишу видео со всеми обьяснениями , позже дам ссылку
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

10 Август 2015, 19:58:47
Ответ #5

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
Сейчас попробовал откомпилировать советник, чтобы проверить на наличие ошибок, выдает ошибки в функции OnInit()
'OnInit' - unexpected token   Ka4eli2.mq4   21   5
'int' - some operator expected   Ka4eli2.mq4   21   1
'return' - semicolon expected   Ka4eli2.mq4   26   4
'{' - some operator expected   Ka4eli2.mq4   22   3
'return' - semicolon expected   Ka4eli2.mq4   26   4
'return' - expressions are not allowed on a global scope   Ka4eli2.mq4   26   4
'}' - expressions are not allowed on a global scope   Ka4eli2.mq4   27   3


Как исправить не знаю

//+------------------------------------------------------------------+
//|                                                      Ka4eli2.mq4 |
//|                                                   Artemov Sergey |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Artemov Sergey"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs

extern double StartLot = 0.01;       //Стартовый лот
input int Slip = 30;                //Проскальзывание
input int Magic = 865;              //Меджик номер
input int Trall = 100;              //Тралл
input int Koridor = 400;            //Расстояние между ордерами BUY и SELL
input double Multiplikator = 2.0    //Множитель следующего лота
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

//================================================//
// Открываем ордер                                //
//================================================//

if (OrdersTotal() == 0)   //Если открытых ордеров нету, то
      {
      OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrLime); //Открыть ордер BUY по текущей цене лотом StartLot
      }
//================================================//
// Выбираем ордер и тралим                        //
//================================================//
   double tr=NormalizeDouble(Trall*Point(),_Digits);  //Нормализуем параметр Trall
   for(int i=OrdersTotal()-1; i>=0; i--)              //Перебираем ордера
      if(OrderSelect(i,SELECT_BY_POS))                //Выбираем ордер
              {
              double oop=OrderOpenPrice();             //И так понятно
              double sl=OrderStopLoss();              //И так понятно
               if(OrderType()==OP_BUY)                //Если ордер на ПОКУПКУ, то тралим его
                 {
                if (oop < Ask && (Ask - oop) > Koridor) //Если цена открытия ордера < Ask и (Ask - цена открытия ордера) > параметра Koridor
                  if((Ask-tr)>oop)
                     if((Ask-tr)>sl)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Ask-tr),_Digits),OrderTakeProfit(),0,clrRed))
                           Print(" Error Trall BUY ",GetLastError());
                 }

                 
               if(OrderType()==OP_SELL)               //Если ордер на продажу, то тралим его
                 {
               if (oop > Bid && (oop - Bid) > Koridor) //Если цена открытия ордера < Bid и (Bid - цена открытия ордера) > параметра Koridor
                  if((Bid+tr)<oop)
                     if((Bid+tr)<sl || sl==0)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Bid+tr),_Digits),OrderTakeProfit(),0,clrRed))
                        Print(" Error Trall SELL ",GetLastError());
                 }
              }   
//================================================//
//Если цена пошла не в сторону последнего ордера  //
//================================================//
   for(int j=OrdersTotal()-1; j>=0; j--)              //Цикл
      if(OrderSelect(j,SELECT_BY_POS))                //Пытаемся выбрать последний ордер
         if(OrderType()==OP_BUY)                      //Если ордер на ПОКУНКУ
            if(OrderOpenPrice() > Ask && (OrderOpenPrice() - Ask) > Koridor) //Если ордер ушел в убыток на KORIDOR пунктов
               {
               StartLot = StartLot * Multiplikator; //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot
               }






//================================================//
// Комменты для настройки сова                    //
//================================================//
Comment(
"OrderOpenPrice: " + OrderOpenPrice() +
"\nAsk: " + Ask +
"\nOrderOpenPrice - Ask: " + (OrderOpenPrice() - Ask));
 
}
//+------------------------------------------------------------------+


Прошу еще обратить внимание на 86 строку, правильно ли сделал?
              StartLot = StartLot * Multiplikator; //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot

10 Август 2015, 20:36:55
Ответ #6

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Сейчас попробовал откомпилировать советник, чтобы проверить на наличие ошибок, выдает ошибки в функции OnInit()
'OnInit' - unexpected token   Ka4eli2.mq4   21   5
'int' - some operator expected   Ka4eli2.mq4   21   1
'return' - semicolon expected   Ka4eli2.mq4   26   4
'{' - some operator expected   Ka4eli2.mq4   22   3
'return' - semicolon expected   Ka4eli2.mq4   26   4
'return' - expressions are not allowed on a global scope   Ka4eli2.mq4   26   4
'}' - expressions are not allowed on a global scope   Ka4eli2.mq4   27   3


Как исправить не знаю

//+------------------------------------------------------------------+
//|                                                      Ka4eli2.mq4 |
//|                                                   Artemov Sergey |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Artemov Sergey"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs

extern double StartLot = 0.01;       //Стартовый лот
input int Slip = 30;                //Проскальзывание
input int Magic = 865;              //Меджик номер
input int Trall = 100;              //Тралл
input int Koridor = 400;            //Расстояние между ордерами BUY и SELL
input double Multiplikator = 2.0 [color=red][b];[/b][/color]   [color=red]//Множитель следующего лота[/color]
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

//================================================//
// Открываем ордер                                //
//================================================//

if (OrdersTotal() == 0)   //Если открытых ордеров нету, то
      {
      OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrLime); //Открыть ордер BUY по текущей цене лотом StartLot
      }
//================================================//
// Выбираем ордер и тралим                        //
//================================================//
   double tr=NormalizeDouble(Trall*Point(),_Digits);  //Нормализуем параметр Trall
   for(int i=OrdersTotal()-1; i>=0; i--)              //Перебираем ордера
      if(OrderSelect(i,SELECT_BY_POS))                //Выбираем ордер
              {
              double oop=OrderOpenPrice();             //И так понятно
              double sl=OrderStopLoss();              //И так понятно
               if(OrderType()==OP_BUY)                //Если ордер на ПОКУПКУ, то тралим его
                 {
                if (oop < Ask && (Ask - oop) > Koridor) //Если цена открытия ордера < Ask и (Ask - цена открытия ордера) > параметра Koridor
                  if((Ask-tr)>oop)
                     if((Ask-tr)>sl)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Ask-tr),_Digits),OrderTakeProfit(),0,clrRed))
                           Print(" Error Trall BUY ",GetLastError());
                 }

                 
               if(OrderType()==OP_SELL)               //Если ордер на продажу, то тралим его
                 {
               if (oop > Bid && (oop - Bid) > Koridor) //Если цена открытия ордера < Bid и (Bid - цена открытия ордера) > параметра Koridor
                  if((Bid+tr)<oop)
                     if((Bid+tr)<sl || sl==0)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Bid+tr),_Digits),OrderTakeProfit(),0,clrRed))
                        Print(" Error Trall SELL ",GetLastError());
                 }
              }   
//================================================//
//Если цена пошла не в сторону последнего ордера  //
//================================================//
   for(int j=OrdersTotal()-1; j>=0; j--)              //Цикл
      if(OrderSelect(j,SELECT_BY_POS))                //Пытаемся выбрать последний ордер
         if(OrderType()==OP_BUY)                      //Если ордер на ПОКУНКУ
            if(OrderOpenPrice() > Ask && (OrderOpenPrice() - Ask) > Koridor) //Если ордер ушел в убыток на KORIDOR пунктов
               {
               StartLot = StartLot * Multiplikator; //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot
               }






//================================================//
// Комменты для настройки сова                    //
//================================================//
Comment(
"OrderOpenPrice: " + OrderOpenPrice() +
"\nAsk: " + Ask +
"\nOrderOpenPrice - Ask: " + (OrderOpenPrice() - Ask));
 
}
//+------------------------------------------------------------------+


Прошу еще обратить внимание на 86 строку, правильно ли сделал?
              StartLot = StartLot * Multiplikator; //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot
input double Multiplikator = 2.0 ;   //Множитель следующего лота

Вроде верно
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

10 Август 2015, 22:53:21
Ответ #7

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
вот посмотрите я закончил.
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

12 Август 2015, 11:32:03
Ответ #8

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
Не могу понять, почему не правильно работает.
Открывается ордер BUY, если цена ушла в убыток на Koridor пунктов, то должен открыться один ордер SELL, а у меня их открывается огромное количество

Если раскомментировать 90 строку, то при компиляции будет ошибка


//+------------------------------------------------------------------+
//|                                                      Ka4eli2.mq4 |
//|                                                   Artemov Sergey |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Artemov Sergey"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs

extern double StartLot = 0.01;       //Стартовый лот
input int Slip = 30;                //Проскальзывание
input int Magic = 865;              //Меджик номер
input int Trall = 100;              //Тралл
input int Koridor = 400;            //Расстояние между ордерами BUY и SELL
input double Multiplikator = 2.0;    //Множитель следующего лота
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

//================================================//
// Открываем ордер                                //
//================================================//

if (OrdersTotal() == 0)   //Если открытых ордеров нету, то
      {
      OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrLime); //Открыть ордер BUY по текущей цене лотом StartLot
      }
//================================================//
// Выбираем ордер и тралим                        //
//================================================//
   double tr=NormalizeDouble(Trall*Point(),_Digits);  //Нормализуем параметр Trall
   for(int i=OrdersTotal()-1; i>=0; i--)              //Перебираем ордера
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))    //Выбираем ордер
              {
              double oop=OrderOpenPrice();            //И так понятно
              double sl=OrderStopLoss();              //И так понятно
               if(OrderType()==OP_BUY)                //Если ордер на ПОКУПКУ, то тралим его
                 {
                if (oop < Ask && (Ask - oop) > (NormalizeDouble(Koridor*_Point,_Digits))) //Если цена открытия ордера < Ask и (Ask - цена открытия ордера) > параметра Koridor
                  if((Ask-tr)>oop)
                     if((Ask-tr)>sl)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Ask-tr),_Digits),OrderTakeProfit(),0,clrRed))
                           Print(" Error Trall BUY ",GetLastError());
                 }

                 
               if(OrderType()==OP_SELL)               //Если ордер на продажу, то тралим его
                 {
               if (oop > Bid && (oop - Bid) > (NormalizeDouble(Koridor*_Point,_Digits))) //Если цена открытия ордера < Bid и (Bid - цена открытия ордера) > параметра Koridor
                  if((Bid+tr)<oop)
                     if((Bid+tr)<sl || sl==0)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Bid+tr),_Digits),OrderTakeProfit(),0,clrRed))
                        Print(" Error Trall SELL ",GetLastError());
                 }
              }   
//=====================================================//
//Если цена пошла не в сторону последнего ордера,      //
//то открываем противоположный ордер увеличенным лотом //
//=====================================================//
   for(int j=OrdersTotal()-1; j>=0; j--)              //Цикл
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))                //Пытаемся выбрать последний ордер
        {
       
         if(OrderType()==OP_BUY)                      //Если ордер на ПОКУПКУ
            if(OrderOpenPrice() > Ask)            //Если ордер BUY ушел в убыток на KORIDOR пунктов
               if((OrderOpenPrice() - Ask) > (NormalizeDouble(Koridor*_Point,_Digits)))
                   {
                   //StartLot = StartLot * Multiplikator                                //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot
                  OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slip,0,0,NULL,Magic,0,clrRed);  //Открываем противоположный ордер
                   }
//=====================================================//           
            if(OrderType()==OP_SELL)
               {
               if(Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) > (NormalizeDouble(Koridor*_Point,_Digits)));          //Если ордер SELL ушел в убыток на KORIDOR пунктов
               StartLot = StartLot * Multiplikator;                                       //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot
                  OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrBlue);  //Открываем противоположный ордер
               }

}


//================================================//
// Комменты для настройки сова                    //
//================================================//
Comment(
"OrderOpenPrice - Ask: " + (OrderOpenPrice() - Ask) +
"\nKORIDOR:   " + (NormalizeDouble(Koridor*_Point,_Digits)) +
"\nAsk: " + Ask +
"\nOrderOpenPrice - Ask: " + (OrderOpenPrice() - Ask));
 
}
//+------------------------------------------------------------------+


Последний открытый ордер выбирается так:
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
Верно?
« Последнее редактирование: 12 Август 2015, 11:52:33 от artemov2012 »

12 Август 2015, 12:18:17
Ответ #9

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Не могу понять, почему не правильно работает.
Открывается ордер BUY, если цена ушла в убыток на Koridor пунктов, то должен открыться один ордер SELL, а у меня их открывается огромное количество

Если раскомментировать 90 строку, то при компиляции будет ошибка


//+------------------------------------------------------------------+
//|                                                      Ka4eli2.mq4 |
//|                                                   Artemov Sergey |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Artemov Sergey"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs

extern double StartLot = 0.01;       //Стартовый лот
input int Slip = 30;                //Проскальзывание
input int Magic = 865;              //Меджик номер
input int Trall = 100;              //Тралл
input int Koridor = 400;            //Расстояние между ордерами BUY и SELL
input double Multiplikator = 2.0;    //Множитель следующего лота
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{

//================================================//
// Открываем ордер                                //
//================================================//

if (OrdersTotal() == 0)   //Если открытых ордеров нету, то
      {
      OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrLime); //Открыть ордер BUY по текущей цене лотом StartLot
      }
//================================================//
// Выбираем ордер и тралим                        //
//================================================//
   double tr=NormalizeDouble(Trall*Point(),_Digits);  //Нормализуем параметр Trall
   for(int i=OrdersTotal()-1; i>=0; i--)              //Перебираем ордера
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))    //Выбираем ордер
              {
              double oop=OrderOpenPrice();            //И так понятно
              double sl=OrderStopLoss();              //И так понятно
               if(OrderType()==OP_BUY)                //Если ордер на ПОКУПКУ, то тралим его
                 {
                if (oop < Ask && (Ask - oop) > (NormalizeDouble(Koridor*_Point,_Digits))) //Если цена открытия ордера < Ask и (Ask - цена открытия ордера) > параметра Koridor
                  if((Ask-tr)>oop)
                     if((Ask-tr)>sl)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Ask-tr),_Digits),OrderTakeProfit(),0,clrRed))
                           Print(" Error Trall BUY ",GetLastError());
                 }

                 
               if(OrderType()==OP_SELL)               //Если ордер на продажу, то тралим его
                 {
               if (oop > Bid && (oop - Bid) > (NormalizeDouble(Koridor*_Point,_Digits))) //Если цена открытия ордера < Bid и (Bid - цена открытия ордера) > параметра Koridor
                  if((Bid+tr)<oop)
                     if((Bid+tr)<sl || sl==0)
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble((Bid+tr),_Digits),OrderTakeProfit(),0,clrRed))
                        Print(" Error Trall SELL ",GetLastError());
                 }
              }   
//=====================================================//
//Если цена пошла не в сторону последнего ордера,      //
//то открываем противоположный ордер увеличенным лотом //
//=====================================================//
   for(int j=OrdersTotal()-1; j>=0; j--)              //Цикл
      if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))                //Пытаемся выбрать последний ордер
        {
       
         if(OrderType()==OP_BUY)                      //Если ордер на ПОКУПКУ
            if(OrderOpenPrice() > Ask)            //Если ордер BUY ушел в убыток на KORIDOR пунктов
               if((OrderOpenPrice() - Ask) > (NormalizeDouble(Koridor*_Point,_Digits)))
                   {
                   //StartLot = StartLot * Multiplikator                                //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot
                  OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slip,0,0,NULL,Magic,0,clrRed);  //Открываем противоположный ордер
                   }
//=====================================================//           
            if(OrderType()==OP_SELL)
               {
               if(Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) > (NormalizeDouble(Koridor*_Point,_Digits)));          //Если ордер SELL ушел в убыток на KORIDOR пунктов
               StartLot = StartLot * Multiplikator;                                       //Тут пытался умножить лот для следующих ордеров, в настройках EXTERN double StartLot
                  OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrBlue);  //Открываем противоположный ордер
               }

}


//================================================//
// Комменты для настройки сова                    //
//================================================//
Comment(
"OrderOpenPrice - Ask: " + (OrderOpenPrice() - Ask) +
"\nKORIDOR:   " + (NormalizeDouble(Koridor*_Point,_Digits)) +
"\nAsk: " + Ask +
"\nOrderOpenPrice - Ask: " + (OrderOpenPrice() - Ask));
 
}
//+------------------------------------------------------------------+


Последний открытый ордер выбирается так:
OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
Верно?
Нет, что бы найти последний открытый ордер нужно в цикле сделать перебор с поиском последнего ордера по времени...
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

13 Август 2015, 14:12:56
Ответ #10

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
Уже 100 раз переписывал код и начинал заново по порядку писать, ничего не выходит.
Вот попытался написать опять с начала
//+------------------------------------------------------------------+
//|                                                       TEST_3.mq4 |
//|                                                   Artemov Sergey |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Artemov Sergey"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs

extern double StartLot = 0.01; //Стартовый лот
input int Slip = 30; //Проскальзывание
input int Magic = 865; //Меджик
input int Koridor = 400; //Коридор
input double Multiplikator = 2.0; //Множитель лота
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {

   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//+------------------------------------------------------------------+
//| Код советника                                                    |
//+------------------------------------------------------------------+
  if(OrdersTotal()==0)
      {
      OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrBlue);
      }
//================================================//
// Выбираем последний ордер                       //
//================================================//
int last = OrderSelect(OrdersTotal()-1,SELECT_BY_TICKET); //Выбрали последний ордер и записали в переменную last
int oop = OrderOpenPrice();
int delta = Ask - oop;
   if(OrderType()==OP_BUY)
      {
      if(Ask > oop)   
      if(delta > NormalizeDouble(Koridor*_Point,_Digits))
            {
            StartLot = StartLot * Multiplikator;
            OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slip,0,0,NULL,Magic,0,clrRed);
            }
         
      }


   if(OrderType()==OP_SELL)
      {
     
      }















Comment(
"Всего ордеров: " + OrdersTotal()
);



   
  }
//+------------------------------------------------------------------+

Почему одновременно с первым лотом открывается ордер SELL? Там же указано условие, что ордер SELL должен открыться если предыдущий ордер уйдет в убыток на KORIDOR пунктов
int last = OrderSelect(OrdersTotal()-1,SELECT_BY_TICKET); //Выбрали последний ордер и записали в переменную last
int oop = OrderOpenPrice();
int delta = Ask - oop;
   if(OrderType()==OP_BUY)
      {
      if(Ask > oop)   
      if(delta > NormalizeDouble(Koridor*_Point,_Digits))
            {
            StartLot = StartLot * Multiplikator;
            OrderSend(Symbol(),OP_SELL,StartLot,Bid,Slip,0,0,NULL,Magic,0,clrRed);
            }
         
      }


   if(OrderType()==OP_SELL)
      {
     
      }

13 Август 2015, 14:32:39
Ответ #11

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Уже 100 раз переписывал код и начинал заново по порядку писать, ничего не выходит.
Вот попытался написать опять с начала

//+------------------------------------------------------------------+
datetime time=0; int type=-1; double lots=0,open_price=0;
for(int i=OrdersTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol())
         if(OrderMagicNumber()==Magic)
            if(OrderOpenTime()>time)    // перебираем все ордера и находим только самый последний
              {                         // запоминаем данные последнего ордера
               time=OrderOpenTime();
               type=OrderType();
               lots=OrderLots();
               open_price=OrderOpenPrice();
              }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
if(type==-1) // Если цикл не нашол ни одного ордера то type==-1 значит ордеров нет и используем начальный лот
  {
   lots=StartLot;
  }
else  // Если цикл нашол ордера то type== будет мемть тип последнего ордера значит используем увеличенный лот
   lots=lots*Multiplikator;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
if(type==OP_BUY)
  {
   if(NormalizeDouble(Bid+koridor*Point(),Digits)<open_price)
   //открыть ордер селл
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
if(type==OP_SELL)
  {

  }
//+------------------------------------------------------------------+
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

13 Август 2015, 17:46:30
Ответ #12

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
Владимир большое спасибо, уже хоть сдвиги есть. Еще месяцок помучаю советник и может сделаю что хотел :)

13 Август 2015, 18:16:41
Ответ #13

Trading-Go

  • Администратор
  • Ветеран

  • Оффлайн
  • *****

  • 2 011
  • Репутация:
    493
  • Пол
    Мужской

    Мужской
Владимир большое спасибо, уже хоть сдвиги есть. Еще месяцок помучаю советник и может сделаю что хотел :)
Пара дней
ВАЖНО НОВОСТЬ О ПЕРЕЕЗДЕ ФОРУМА
Своей помощью я стараюсь не давать готовое, я стараюсь натолкнуть Вас на понимание и на правильные мысли, что бы Вы сами решили свою задачу и получили знания... Как то так...

13 Август 2015, 18:20:48
Ответ #14

artemov2012

  • Новичок

  • Оффлайн
  • *

  • 43
  • Репутация:
    3
  • Пол
    Мужской

    Мужской
Если бы умел программировать, тогда за пару дней сделал бы, а так... Еще и времени нету
Интересует такой вопрос:
Когда в самом начале я открываю ордер BUY

  if(OrdersTotal()==0)
      {
      OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrBlue);
      }

Этот ордер почему-то является не верхней или нижней границей КОРИДОРА, а СЕРЕДИНОЙ (на скриншоте видно)
А все последующие ордера открываются по принципу Koridor = Koridor * 2; Это можно было бы легко исправить, просто указывая желаемый Koridor в 2 раза меньше, но тогда мешает самый первый ордер


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

//+------------------------------------------------------------------+
//|                                                       TEST_3.mq4 |
//|                                                   Artemov Sergey |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Artemov Sergey"
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property show_inputs


extern double StartLot = 0.01; //Стартовый лот
input int Slip = 30; //Проскальзывание
input int Magic = 865; //Меджик
input int Koridor = 400; //Коридор
input double Multiplikator = 2.0; //Множитель лота
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {


   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {


   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//+------------------------------------------------------------------+
//| Код советника                                                    |
//+------------------------------------------------------------------+
  if(OrdersTotal()==0)
      {
      OrderSend(Symbol(),OP_BUY,StartLot,Ask,Slip,0,0,NULL,Magic,0,clrBlue);
      }
//================================================//
// Выбираем последний ордер                       //
//================================================//
//+------------------------------------------------------------------+
datetime time=0; int type=-1; double lots=0,open_price=0;
for(int i=OrdersTotal()-1; i>=0; i--)
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      if(OrderSymbol()==Symbol())
         if(OrderMagicNumber()==Magic)
            if(OrderOpenTime()>time)    // перебираем все ордера и находим только самый последний
              {                         // запоминаем данные последнего ордера
               time=OrderOpenTime();
               type=OrderType();
               lots=OrderLots();
               open_price=OrderOpenPrice();
              }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
if(type==-1) // Если цикл не нашол ни одного ордера то type==-1 значит ордеров нет и используем начальный лот
  {
   lots=StartLot;
  }
else  // Если цикл нашол ордера то type== будет мемть тип последнего ордера значит используем увеличенный лот
   lots=lots*Multiplikator;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
if(type==OP_BUY)
  {
  if(OrderOpenPrice() > Ask && (OrderOpenPrice() - Ask) > NormalizeDouble(Koridor*Point,Digits)) 
  OrderSend(Symbol(),OP_SELL,lots,Bid,Slip,0,0,NULL,Magic,0,clrRed);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
if(type==OP_SELL)
  {
   if(OrderOpenPrice() < Bid && (Bid - OrderOpenPrice()) > NormalizeDouble(Koridor*Point,Digits))
   OrderSend(Symbol(),OP_BUY,lots,Ask,Slip,0,0,NULL,Magic,0,clrBlue);
  }
//+------------------------------------------------------------------+
























Comment(
"Всего ордеров: " + OrdersTotal() +
"\nКОРИДОР: " + NormalizeDouble(Koridor*_Point,_Digits) +
"\nAsk : " + Ask +
"\nOrderOpenPrice: " + OrderOpenPrice() +
"\nДельта: " + (Ask - OrderOpenPrice())


);






   
  }
//+------------------------------------------------------------------+