[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 285

 
rid >>:

Возможно, поможет функция https://www.mql5.com/ru/forum/107476/page21

Функция isCloseLastPosByTake().
Эта функция возвращает флаг закрытия последней позиции по тейку.

Флаг поднят - True - сработал TakeProfit.

Флаг опущен - False - позиция была закрыта по другой причине.


Саму функцию ставить в самом конце кода. А в условия для продажи добавить :


Доброго дня,вечера или утра всем ВАМ.

Всё сделал как rid писал. Функцию вставил в самый конец кода, в условия для продажи добавил

if( isCloseLastPosByTake( NULL, OP_BUY,MagicNumber) ==true) {//продаем

только подумал, подумал и добавил и для покупки. Ведь ордера будут закрываться не только по BUY но и по SHELL.

Функцию isCloseLasPosByTake() вставил в конце, при компиляции получилось

2;116;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;104:33;'(' - function definition unexpected
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:7;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;109:14;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:27;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;112:33;'sy' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:15;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;114:37;'op' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:17;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;115:46;'mn' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;116:19;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;117:17;'t' - variable not defined
2;75;C:\Program Files\MetaTrader - Alpari\experts\SimpleMA22333.mq4;127:19;'sy' - variable not defined

вот такие пироги, или кок говаривал п/п-к ГОЦМАН картина маслом. Подмогните чайнику....непетрю ничаго.......

ааа сам код(т. е. только ф-я старт)

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if(MAF_1 < MAS_1 && MAF_0 > MAS_0)
    if( isCloseLastPosByTake( NULL, OP_SELL,MagicNumber) ==true) {//покупаем
     if(CheckOrders(OP_SELL))
      {
       if(StopLoss <= StopLevel+Spread)
         double SL = 0;
        else
         SL = Ask - StopLoss*Point;
       if(TakeProfit <= StopLevel-Spread)
         double TP = 0;
        else
         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
       }
    
    // Открытие позиции Sell продажа  
    if(MAF_1 > MAS_1 && MAF_0 < MAS_0)
    if( isCloseLastPosByTake( NULL, OP_BUY,MagicNumber) ==true) {//продаем
     if(CheckOrders(OP_BUY))
      {
       if(StopLoss <= StopLevel+Spread)
         SL = 0;
        else
         SL = Bid + StopLoss*Point;
       if(TakeProfit <= StopLevel-Spread)
         TP = 0;
        else
         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
       }
       bool isCloseLastPosByTake(string sy=NULL, int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0")sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()== sy || sy==NULL) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()== op) {
            if (mn<0 || OrderMagicNumber()== mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }
            }
          }
        }
      }
    }
  }
  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}
//----
   return(0);
  }//+------------------------------------------------------------------+
 
igrok2008 >>:


Я же специально писал в своем сообщении. Что эту функцию isCloseLastPosByTake() - надо ставить в самый конец кода, ВНЕ ФУНКЦИИ СТАРТ !

А ты её куда воткнул ?

И внимательнее с фигурными скобками в условиях продажи и условиях покупки. Там у тебя их явно не хватает (проверяй - чтобы число открытых скобок равнялось числу закрытых). Вот исправил продажу  :

    //  ----- Открытие позиции Sell продажа------------  
    if(MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY,MagicNumber) ==true) {
     if(CheckOrders(OP_BUY))                                     {
       if(StopLoss <= StopLevel+Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if(TakeProfit <= StopLevel-Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
 

Добрый день!!!


Нужна помощь. Извиняюсь за не скромность.

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

Программировать на MQL4 к сожалению пока не научился.


Сам советник прикрепляю.


Заранее спасибо всем, кто откликнется!!!

 
rid >>:

Я же специально писал в своем сообщении. Что эту функцию isCloseLastPosByTake() - надо ставить в самый конец кода, ВНЕ ФУНКЦИИ СТАРТ !

А ты её куда воткнул ?

И внимательнее с фигурными скобками в условиях продажи и условиях покупки. Там у тебя их явно не хватает (проверяй - чтобы число открытых скобок равнялось числу закрытых). Вот исправил продажу :


Я её воткнул после ф-ии старт, я так понял.....

Значит неправильно понял, благодарю за подзатыльник :-))

Если правильно понял, то её надо ставить после } в конце блока expert deinitialization function ??????? или после return(0); в самом конце ф-ии старт???????

Заранее спасибо за терпение!!!!!!!!!

 
igrok2008 >>:

Я её воткнул после ф-ии старт, я так понял.....

Значит неправильно понял, благодарю за подзатыльник :-))

Если правильно понял, то её надо ставить после } в конце блока expert deinitialization function ??????? или после return(0); в самом конце ф-ии старт???????

Заранее спасибо за терпение!!!!!!!!!

Её нужно ставить снаружи. Не внутри какой-ниб . функции, - а как отдельную самостоятельную функцию.

Вот так :

int start()
  {
//----
    // Узнаем уровень стопов и спрэд
    int Spread = MarketInfo(Symbol(), MODE_SPREAD);
    int StopLevel = MarketInfo(Symbol(), MODE_STOPLEVEL);

    // Рассчитываем значения средних на 0-ом и 1-ом барах
    double MAF_0 = iMA(NULL, 0, MAFP, 0, 1, 1, 0);
    double MAF_1 = iMA(NULL, 0, MAFP, 0, 1, 1, 1);
    double MAS_0 = iMA(NULL, 0, MASP, 0, 1, 1, 0);
    double MAS_1 = iMA(NULL, 0, MASP, 0, 1, 1, 1);
    
    // открытие позиции Buy покупка
    if(MAF_1 < MAS_1 && MAF_0 > MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_SELL,MagicNumber) ==true) {
     if(CheckOrders(OP_SELL))                                      {
       if(StopLoss <= StopLevel+Spread)
         double SL = 0;        else         SL = Ask - StopLoss*Point;
       if(TakeProfit <= StopLevel-Spread)
         double TP = 0;        else         TP = Ask + TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_BUY, Lots, Ask, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Buy. Ошибка №", GetLastError()); 
                }
               }
              }
//-------------------Конец покупки -----------------------

    //  ----- Открытие позиции Sell продажа------------  
    if(MAF_1 > MAS_1 && MAF_0 < MAS_0)                         {
    if( isCloseLastPosByTake( NULL, OP_BUY,MagicNumber) ==true) {
     if(CheckOrders(OP_BUY))                                     {
       if(StopLoss <= StopLevel+Spread)
         SL = 0;        else         SL = Bid + StopLoss*Point;
       if(TakeProfit <= StopLevel-Spread)
         TP = 0;        else         TP = Bid - TakeProfit*Point;
       if(!OrderSend(Symbol(), OP_SELL, Lots, Bid, 5, SL, TP, NULL, MagicNumber))
         Print("Не открыт ордер Sell. Ошибка №", GetLastError()); 
                 }
                }
               }
      //---конец блока продажи ------------------------------
    
//----
   return(0);
  }//+----------КОНЕЦ ФУНКЦИИ СТАРТ -------------------+


//ЖЖЖЖЖЖЖ Другие вызываемые пользовательские функции ЖЖЖЖЖЖ

 //+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 19.05.2008                                                     |
//|  Описание : Возвращает флаг закрытия           |
//|  последней позиции по тейку.                                    |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
bool isCloseLastPosByTake(string sy="", int op=-1, int mn=-1) {
  datetime t;
  double   ocp, otp;
  int      dg, i, j=-1, k=OrdersHistoryTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderCloseTime()) {
                t=OrderCloseTime();
                j=i;
              }} }}}}}

  if (OrderSelect(j, SELECT_BY_POS, MODE_HISTORY)) {
    dg=MarketInfo(sy, MODE_DIGITS);
    if (dg==0) if (StringFind(OrderSymbol(), "JPY")<0) dg=4; else dg=2;
    ocp=NormalizeDouble(OrderClosePrice(), dg);
    otp=NormalizeDouble(OrderTakeProfit(), dg);
    if (ocp==otp) return(True);
  }
  return(False);
}


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

Нужно убрать ф-ю Функция isCloseLastPosByTake() или из условия для покупки, или из условий для продажи. 

Тогда советник заработает.

 
Rover82 >>:

Добрый день!!!

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

Сам советник прикрепляю.

Заранее спасибо всем, кто откликнется!!!


Вряд ли, кто откликнется. Советник декомпеллированный (взломанный) и такие файлы здесь не приветствуются...

 
WinExec("C:\\Program Files\\Opera\\opera.exe http://www.mail.ru",2);
Всем привет! Это запуск ссылки конкретным браузером, а как запустить эту же ссылку по умолчанию?
 
Тоесть браузером который стоит по умолчанию
 
Dimoncheg >>:
Тоесть браузером который стоит по умолчанию

ShellExecute, команда "open", емнип.

 

Решил изучить MQL 4 т.к. все найденное не соответствует моим чаяниям. Сейчас разбираюсь в чужом советнике, что бы понять как работают профессионалы и слегка улучшить его под свою идею. Там есть (простая и небольшая, на одну страницу) пользовательская функция код ее прилагаю. По причине своей чайниковости два дня не могу понять - что вернет эта функция в результате, и к какому вложенному условию приналежит Еlse?-когда оно сработает?

Пожелает ли кто-нибудь заронить искру знаний в мою дремучесть?

У меня получается следующее:

Цель всей ф-и - определить есть ли уже выставленный ордер по данной паре и если есть определить его тип.

Функция запустившая данную функцию ждет, что при наличии одного и ордеров, выбранных в процедуре switch, функция должная вернуть значение «1», при наличии двух ордеров - «2» и при отсутствии ордеров «-1».

Цикл запускается при l_pos_16 = 0. Допустим всего по нескольким парам имеется четыре отложенных ордера, в том числе два по паре, в которой работает советник и они не первые.

Однако у меня получается, что при первой итерации цикла функция if(OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) будет проверять в списке ордеров позицию с номером «0», но такой позиции нет, (т.к я понимаю нумерация идет с позиции №1) и тогда будет передача на else с полным выходом из fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12) с возвратом значения Return(-1).

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

Однако при работе советника эта функция определяет и дает то, что ждет от нее вызвавшая функция, которая далее работает в зависимости от полученного результата.

Так же никак не могу понять else Return(-1) сработает в

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

Или же в составе if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

КОД функции :

int fCountOrders(int &a_count_0, int &a_count_4, int &a_count_8, int &a_count_12)

a_count_0 = 0;

a_count_4 = 0;

a_count_8 = 0;

a_count_12 = 0;

gi_252 = 0;

for (int l_pos_16 = 0; l_pos_16 < OrdersTotal(); l_pos_16++) {

if (OrderSelect(l_pos_16, SELECT_BY_POS, MODE_TRADES)) {

if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic_N) {

switch (OrderType()) case OP_BUY:

a_count_0++;

gi_252 = 1;

g_ticket_268 = OrderTicket();

gs_272 = OrderComment();

g_ord_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

break;

case OP_SELL:

a_count_4++;

gi_252 = -1;

g_ticket_268 = OrderTicket();

gs_272 = OrderComment();

g_ord_open_price_256 = OrderOpenPrice();

g_ord_stoploss_288 = OrderStopLoss();

g_ord_takeprofit_296 = OrderTakeProfit();

break;

case OP_BUYSTOP:

a_count_8++;

break;

case OP_SELLSTOP:

a_count_12++;

}

}

} else return (-1);

}

return (a_count_0 + a_count_4 + a_count_8 + a_count_12);

/*при нормальном выполнении ф-и будет возвращена единица в переменной в одном из case и «0» во всех остальных, что указывает, что есть один из

типов ордера и при этом вызвавшей функции доступен номер этого ордера,

комментарий, цена открытия, стоп лосс и тайк профит */

}

Причина обращения: