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

Pammexpert

Местный житель
= Может при определенных настройках он и будет, но... пока эта опция тупо есть.=

Я так понимаю, что вам не известен правильный алгоритм работы и использования такой функции.
Но это совсем не значит, что она не способна приносить профит.
Поэтому и результат такой =тупо есть=.
 

vladradon

Программист
Я так понимаю, что вам не известен правильный алгоритм работы и использования такой функции.
Но это совсем не значит, что она не способна приносить профит.
Поэтому и результат такой =тупо есть=.
Я могу только улыбаться...:)
 

vladradon

Программист
Частичное закрытие позиций применяется давно и с пользой.
Существует несколько методов такого применения:
- частичное закрытие в % отношении по лоту в зависимости от пройденных ценой пунктов (в нашем направлении).
- частичное закрытие равными частями по лоту в зависимости от пройденных ценой пунктов (в нашем направлении).
- частичное закрытие в сочетании с БезУбытком ( то же несколько вариантов)
- и т.д.

----- И вершиной этого метода является некий симбиоз частичного закрытия (ЧЗ) с трейлингом. Его называют по разному, но суть от этого не меняется. И вот здесь важно правильно закодировать и настроить его к использованной стратегии.

Немного истории - один трейдер применял этот метод в сочетании со своей стратегией (брокера не называю - рекламой не занимаюсь, но скажу так - брокер известный и с евро-регуляцией). На старте на счету было 11 миллиардов вечно-зелёных денег. Были и просадки и профит. Через 2 недели он достиг уровня в 17 МЛРД. $.
(не спрашивайте - откуда у него столько денег? Нужно просто уметь найти инвестора).
Так вот, ТС с правильным применением ЧЗ в сочетании с трейлингом дает хорошие результаты. Есть реальные подтверждения.
Мне-то это зачем нужно читать? Я и без вас в курсе. Выкладывать на форуме то, что не несет полезной инфы не признак присутствия интелекта.
 

Pammexpert

Местный житель
Мне-то это зачем нужно читать? Я и без вас в курсе. Выкладывать на форуме то, что не несет полезной инфы не признак присутствия интелекта.
Всё говорит о том, что я прав - эта ф-ция у вас работает неправильно (учите матчасть, шура). И это факт, но вы упорно уверены в своем величии.
Будьте проще, и может тогда к вам придёт прозрение и вы поймете, что нельзя объять необъятное.
И на этом считаю наш диалог закончен, ибо у вас наблюдаются некие проблемы с психикой. Но я уверен, что вы с этим справитесь. Желаю удачи!
 

vladradon

Программист
Всё говорит о том, что я прав - эта ф-ция у вас работает неправильно (учите матчасть, шура). И это факт, но вы упорно уверены в своем величии.
Будьте проще, и может тогда к вам придёт прозрение и вы поймете, что нельзя объять необъятное.
И на этом считаю наш диалог закончен, ибо у вас наблюдаются некие проблемы с психикой. Но я уверен, что вы с этим справитесь. Желаю удачи!

Всё говорит о том, что я прав - эта ф-ция у вас работает неправильно (учите матчасть, шура). И это факт, но вы упорно уверены в своем величии.
Будьте проще, и может тогда к вам придёт прозрение и вы поймете, что нельзя объять необъятное.
И на этом считаю наш диалог закончен, ибо у вас наблюдаются некие проблемы с психикой. Но я уверен, что вы с этим справитесь. Желаю удачи!
О том, что ты прав, пока что говоришь только ты. Поэтому засунь свой нос туда, откуда высунул...
 
Последнее редактирование:

eevviill2

Местный знаток
PHP:
OBJ_ELLIPSE
установим соотношение между временной и ценовой шкалами  
   ObjectSetDouble(chart_ID,name,OBJPROP_SCALE,InpEllipseScale);
Просвятите пожалуйста как это работает. Как мне узнать координату там где знак вопроса?
Видно сложная задача была.

Пока искал решил другую.
Координаты Канала стандартного отклонения.
PHP:
extern double deviation = 2; 



/////////////////////////////////////////// 
void OnStart() 
{ 
int Lb=39; 
int Rb=1; 
double left_cent=4*iMA(Symbol(),PERIOD_CURRENT,Lb-Rb+1,0,MODE_SMA,PRICE_CLOSE,Rb)-3*iMA(Symbol(),PERIOD_CURRENT,Lb-Rb+1,0,MODE_LWMA,PRICE_CLOSE,Rb); 
double right_cent=3*iMA(Symbol(),PERIOD_CURRENT,Lb-Rb+1,0,MODE_LWMA,PRICE_CLOSE,Rb)-2*iMA(Symbol(),PERIOD_CURRENT,Lb-Rb+1,0,MODE_SMA,PRICE_CLOSE,Rb); 

double devi=iStdDev(Symbol(),PERIOD_CURRENT,Lb-Rb+1,0,MODE_SMA,PRICE_CLOSE,Rb); 
double left_up=left_cent+devi*deviation; 
double left_down=left_cent-devi*deviation; 
double right_up=right_cent+devi*deviation; 
double right_down=right_cent-devi*deviation; 

double step=MathAbs(left_cent-right_cent)/(Lb-Rb+1); 


Alert(left_cent," ",left_up," ",step); 
}
 

Milord

Местный знаток
Это настройки пуш-уведомлений. В языке mql есть возможность отправлять такие уведомления при определённых событиях. Например открылся ордер, ты на телефон получаешь уведомление. В общем это замена отправки СМС через майл. Плюс к этому, если на сайте mql5 кто-то обращается именно к тебе и при обращении пишет @Milord то в этом случае тоже получаешь уведомление о том, что кто-то хочет с тобой пообщаться.
Но это лишь теория. Я не сторонник этой хрени и подробные тексты не видел. Из советника приходит то что написано в коде, а вот с сайта не знаю.


Точней не просто на телефон, а на МТ установленный на телефоне\смартфоне.

SendNotification
Посылает уведомление на мобильные терминалы, чьи MetaQuotes ID указаны в окне настроек на закладке "Уведомления".
Код:
bool  SendNotification(
   string  text          // текст сообщения
   );

то есть если МТ4 - стоит на компе, то на сотовый не будут приходить уведомления из советника?
и где взять этот ID от метаквотов?
 

AlexeyVik

Программист mql4 mql5
то есть если МТ4 - стоит на компе, то на сотовый не будут приходить уведомления из советника?
и где взять этот ID от метаквотов?
Как я понимаю, надо на сотовый поставить любой терминал, МТ4 или МТ5 и получить ID. Потом можно торгуя на МТ4 посылать уведомления на ID указанные на той закладке. Видимо можно указать несколько ID.
 

mobidik

-----
то есть если МТ4 - стоит на компе, то на сотовый не будут приходить уведомления из советника?
и где взять этот ID от метаквотов?

Хоть статья и для МТ5, но принцип тот же, иначе, гугл, думаю, что у тебя не заблокирован.
https://www.mql5.com/ru/articles/476
 

Milord

Местный знаток
Спецы MQL4 - будет ли этот мартингейл правильно работать?

написал простую функцию мартина,гляньте свежим взглядом -будет ли он работать, есть ли в коде логические или синтаксические ошибки?

PHP:
void Martin()
{
for(int i=OrdersTotal()-1;i>=0; i--) 
{ 
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderMagicNumber()==Magic)
{ 
//-----------------------------------------    
   if(OrderType()==OP_SELL)
    { 
     if(Bid>=OrderOpenPrice()+Mpip*Point) 
      { 
      OrderSend(Symbol(),OP_SELL,Lots*LotExp,Bid,slippage,0,Bid-TP*Point,"",Magic,0,Magenta);
      } 
    } 
//-----------------------------------------
   if(OrderType()==OP_BUY) 
    { 
     if(Ask<=OrderOpenPrice()-Mpip*Point)
      { 
      OrderSend(Symbol(),OP_BUY,Lots*LotExp,Ask,slippage,0,Ask+TP*Point,"",Magic,0,Aqua);
      }
    }
//----     
} 
}  
}
}
//---------end--------
 
Последнее редактирование:

mobidik

-----
написал простую функцию мартина,гляньте свежим взглядом -будет ли он работать, есть ли в коде логические или синтаксические ошибки?

PHP:
void Martin()
{
for(int i=OrdersTotal()-1;i>=0; i--) 
{ 
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if(OrderSymbol()==Symbol())
{
if(OrderMagicNumber()==Magic)
{ 
//-----------------------------------------    
   if(OrderType()==OP_SELL)
    { 
     if(Bid>=OrderOpenPrice()+Mpip*Point) 
      { 
      OrderSend(Symbol(),OP_SELL,Lots*LotExp,Bid,slippage,0,Bid-TP*Point,"",Magic,0,Magenta);
      } 
    } 
//-----------------------------------------
   if(OrderType()==OP_BUY) 
    { 
     if(Ask<=OrderOpenPrice()-Mpip*Point)
      { 
      OrderSend(Symbol(),OP_BUY,Lots*LotExp,Ask,slippage,0,Ask+TP*Point,"",Magic,0,Aqua);
      }
    }
//----     
} 
}  
}
}
//---------end--------

Работать, однозначно, будет, но:
1) синтаксические ошибки:
все данные, что передаются на сервер брокера, должны быть нормализованные, т.е., лотность должна быть задана с точностью макс. до двух знаков, а значения цен - с точность для данного символа у данного брокера.
2) логические ошибки:
как только в рынке станет: один ордер стартовый + один по мартину, выполниться условие по дистанции - начнет ставить ордера на каждом тике пока хватит денег на счете. А все из-за того, что нет проверки на самый последний ордер, ведь нужно относительно его цены открытия проверять дистанцию для открытия по мартину.
Найти самый последний ордер можно как по времени, так и по тикету ордера.
 

Milord

Местный знаток
Работать, однозначно, будет, но:
1) синтаксические ошибки:
все данные, что передаются на сервер брокера, должны быть нормализованные, т.е., лотность должна быть задана с точностью макс. до двух знаков, а значения цен - с точность для данного символа у данного брокера.
2) логические ошибки:
как только в рынке станет: один ордер стартовый + один по мартину, выполниться условие по дистанции - начнет ставить ордера на каждом тике пока хватит денег на счете. А все из-за того, что нет проверки на самый последний ордер, ведь нужно относительно его цены открытия проверять дистанцию для открытия по мартину.
Найти самый последний ордер можно как по времени, так и по тикету ордера.

насчет первого пункта более-менее понятно, нужно применить нормализацию до 2 знака для лота, и для цены до 4 или 5-го..;)

а вот по второму пункту, вапще не понял:facepalm:, то ли я торможу, то ли вы не очень понятно суть написали,не могли бы вы в коде показать на моем куске кода, как воткнуть эту проверку и куда?
 

mobidik

-----
насчет первого пункта более-менее понятно, нужно применить нормализацию до 2 знака для лота, и для цены до 4 или 5-го..;)

а вот по второму пункту, вапще не понял:facepalm:, то ли я торможу, то ли вы не очень понятно суть написали,не могли бы вы в коде показать на моем куске кода, как воткнуть эту проверку и куда?

А что не понятно? Ваш код находит самый первый ордер, начнем с того, что он единственный в рынке. Проверяем по условию дистанции - будем считать, что условие выполняется, тогда нужно открыть ордер - открыли, в списке больше нет ордеров - выход из функции. Да, все норм, на данном тике, но наступает следующий тик, а у нас в рынке уже два ордера. В данном случае даже не важно в какой последовательности будем перебирать ордера - все равно, нужно проверить все. Так вот, находим и проверяем первый ордер, напомню, что по нему уже есть позиция по мартину, но Ваш код этого не знает и как следствие - устанавливает ордер если не по той же цене, что при предыдущем тике, тогда по цене рядышком. Затем находит ордер, что был установлен по мартину ранее - условие не выполняется, но в рынке уже три ордера. Условие для установки ордера по мартину будет всегда истинно по отношению к самому первому ордеру. Как-то так, надеюсь, понятно расписал.
На счет примера, вот, как вариант:
PHP:
void Martin()
  {
    int    LastTicket = 0;
    int    LastType   =-1;
    double LastOpenPr = 0;
    double LastLot    = 0;
    
    for(int i=OrdersTotal()-1;i>=0; i--) 
     { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))                 // Проверяем только рыночные ордера
        {                                                             //
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)    // Только по данному символу с заданным меджиком
           {                                                          //
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)          // Проверку производим только по ордерам BUY/SELL
              {                                                       //
                if(LastTicket<OrderTicket())                          // Усди тикет найденного ордера больше за предыдущий
                 {                                                    // значит он последний среди уже проверенных
                   LastTicket = OrderTicket();                        // запомним его значение
                   LastType   = OrderType();                          // запомним его тип 
                   LastOpenPr = OrderOpenPrice();                     // запомним его цену открытия
                   LastLot    = OrderLots();                          // и запомним его лот
                 }
              } 
           }
        }
     }  
   
    if(LastTicket==0) return;                                         // Перебрали все ордера, если LastTicket=0 - ордеров
                                                                      // в рынке нет - выход из функции 
    if(LastType!=-1 && LastOpenPr!=0 && LastLot!=0)                   // иначе проверим наличие полученных данных
     {                                                                //
       if(LastType==OP_BUY)                                           // если последний ордер BUY 
        {                                                             //
          if(Ask<=LastOpenPr-Mpip*Point)                              // проверим на условие дистанции
           {                                                          // если условие выполняется - установим новый ордер
             double OOL = NormalizeDouble(LastLot*LotExp,2);          // зададим лот
             double OOP = NormalizeDouble(Ask,Digits);                // зададим цену открытия
             double OTP = NormalizeDouble(Ask+TP*Point,Digits);       // зададим значение ТР
             
             if(!OrderSend(Symbol(),OP_BUY,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!!
              Print("Ошибка установки ордера BUY, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке
           }
        }
//----    
       if(LastType==OP_SELL)                                          // если последний ордер SELL 
        {                                                             //
          if(Bid>=LastOpenPr+Mpip*Point)                              // проверим на условие дистанции
           {                                                          // если условие выполняется - установим новый ордер
             double OOL = NormalizeDouble(LastLot*LotExp,2);          // зададим лот
             double OOP = NormalizeDouble(Bid,Digits);                // зададим цену открытия
             double OTP = NormalizeDouble(Bid-TP*Point,Digits);       // зададим значение ТР
             
             if(!OrderSend(Symbol(),OP_SELL,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!!
              Print("Ошибка установки ордера SELL, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке
           }
        }
     }
  }   
//---------end--------
 

Milord

Местный знаток
А что не понятно? Ваш код находит самый первый ордер, начнем с того, что он единственный в рынке. Проверяем по условию дистанции - будем считать, что условие выполняется, тогда нужно открыть ордер - открыли, в списке больше нет ордеров - выход из функции. Да, все норм, на данном тике, но наступает следующий тик, а у нас в рынке уже два ордера. В данном случае даже не важно в какой последовательности будем перебирать ордера - все равно, нужно проверить все. Так вот, находим и проверяем первый ордер, напомню, что по нему уже есть позиция по мартину, но Ваш код этого не знает и как следствие - устанавливает ордер если не по той же цене, что при предыдущем тике, тогда по цене рядышком. Затем находит ордер, что был установлен по мартину ранее - условие не выполняется, но в рынке уже три ордера. Условие для установки ордера по мартину будет всегда истинно по отношению к самому первому ордеру. Как-то так, надеюсь, понятно расписал.
На счет примера, вот, как вариант:
PHP:
void Martin()
  {
    int    LastTicket = 0;
    int    LastType   =-1;
    double LastOpenPr = 0;
    double LastLot    = 0;
    
    for(int i=OrdersTotal()-1;i>=0; i--) 
     { 
       if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))                 // Проверяем только рыночные ордера
        {                                                             //
          if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)    // Только по данному символу с заданным меджиком
           {                                                          //
             if(OrderType()==OP_BUY || OrderType()==OP_SELL)          // Проверку производим только по ордерам BUY/SELL
              {                                                       //
                if(LastTicket<OrderTicket())                          // Усди тикет найденного ордера больше за предыдущий
                 {                                                    // значит он последний среди уже проверенных
                   LastTicket = OrderTicket();                        // запомним его значение
                   LastType   = OrderType();                          // запомним его тип 
                   LastOpenPr = OrderOpenPrice();                     // запомним его цену открытия
                   LastLot    = OrderLots();                          // и запомним его лот
                 }
              } 
           }
        }
     }  
   
    if(LastTicket==0) return;                                         // Перебрали все ордера, если LastTicket=0 - ордеров
                                                                      // в рынке нет - выход из функции 
    if(LastType!=-1 && LastOpenPr!=0 && LastLot!=0)                   // иначе проверим наличие полученных данных
     {                                                                //
       if(LastType==OP_BUY)                                           // если последний ордер BUY 
        {                                                             //
          if(Ask<=LastOpenPr-Mpip*Point)                              // проверим на условие дистанции
           {                                                          // если условие выполняется - установим новый ордер
             double OOL = NormalizeDouble(LastLot*LotExp,2);          // зададим лот
             double OOP = NormalizeDouble(Ask,Digits);                // зададим цену открытия
             double OTP = NormalizeDouble(Ask+TP*Point,Digits);       // зададим значение ТР
             
             if(!OrderSend(Symbol(),OP_BUY,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!!
              Print("Ошибка установки ордера BUY, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке
           }
        }
//----    
       if(LastType==OP_SELL)                                          // если последний ордер SELL 
        {                                                             //
          if(Bid>=LastOpenPr+Mpip*Point)                              // проверим на условие дистанции
           {                                                          // если условие выполняется - установим новый ордер
             double OOL = NormalizeDouble(LastLot*LotExp,2);          // зададим лот
             double OOP = NormalizeDouble(Bid,Digits);                // зададим цену открытия
             double OTP = NormalizeDouble(Bid-TP*Point,Digits);       // зададим значение ТР
             
             if(!OrderSend(Symbol(),OP_SELL,OOL,OOP,slippage,0,OTP,"",Magic,0,Aqua))// Установка ордера не для ECN счета!!!
              Print("Ошибка установки ордера SELL, код ошибки - ",GetLastError());  // если ордер не установился, узнаем по какой ошибке
           }
        }
     }
  }   
//---------end--------

спасибо за помощь,не думал что такой большой код получится:facepalm:,то есть проще и короче уже нельзя?
 

eevviill2

Местный знаток
спасибо за помощь,не думал что такой большой код получится:facepalm:,то есть проще и короче уже нельзя?
Короче нет, но у меня такой вариант.
Лучше тем что мартинит в обе стороны.
PHP:
/////////////////////////////////////////////////////////////////////////////////// 
 void martini_f(string symb="")
 {
 double order_B_price=-1;
double order_S_price=-1;
int type=-1;
string symb_B;
string symb_S;


 for(int i=OrdersTotal()-1; i>=0; i--)
 {
   if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
   
   if(OrderMagicNumber()!=Magic || (symb!="" && OrderSymbol()!=symb)) continue;
    type=OrderType();
   
   if(order_B_price==-1 && type==OP_BUY) {order_B_price=OrderOpenPrice();symb_B=OrderSymbol();}
   if(order_S_price==-1 && type==OP_SELL) {order_S_price=OrderOpenPrice();symb_S=OrderSymbol();}
   
   if(order_B_price!=-1 && order_S_price!=-1) break;
 }
   
   
   
   
   if(order_B_price!=-1)
   {
   double point=MarketInfo(symb_B,MODE_POINT)*point_multip;
   //
   if(MarketInfo(symb_B,MODE_ASK)<=order_B_price-step*point) 
   {
    CountOpenedPositions_f(symb);
    double Lotss=Lot*MathPow(Lot_multip,buys_);
   int ticket_op_m=-1;
   
   for (int j_op_b = 0; j_op_b < MaxAttempts; j_op_b++)
 {
 while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
 RefreshRates();
                             
  ticket_op_m=OrderSend(symb,OP_BUY,NormalizeDouble(Lotss,nor_lot),MarketInfo(symb_B,MODE_ASK),Slippage,0,0,comment,Magic,0,clrNONE);

 if(ticket_op_m>-1)break;
 }
   
   } 
   }    
        
   if(order_S_price!=-1)
   {
   double point=MarketInfo(symb_S,MODE_POINT)*point_multip;
   //
   if(MarketInfo(symb_S,MODE_BID)>=order_S_price+step*point) 
   {
    CountOpenedPositions_f(symb);
    double Lotss=Lot*MathPow(Lot_multip,sells_);
   int ticket_op_m=-1;
   
    for (int j_op_s = 0; j_op_s < MaxAttempts; j_op_s++)
 {
 while(IsTradeContextBusy()) Sleep(int(pause_if_busy*1000));
 RefreshRates();
                             
  ticket_op_m=OrderSend(symb,OP_SELL,NormalizeDouble(Lotss,nor_lot),MarketInfo(symb_S,MODE_BID),Slippage,0,0,comment,Magic,0,clrNONE);

 if(ticket_op_m>-1)break;
 }
   
   }
   }     
  
 
 }
 

MrGreen86

Гуру форума
Приветствую--
Подскажите пожалуйста почему не слушается и как сделать чтоб сов закрывал половину определённого ордера?

все просто. вы нажимаете кнопку PullCLOSED, верно?
по коду у вас первым идет это условие:
StringFind(sparamA,"CLOSED",0) >= 0

и оно выполняется так как он находит в названии кнопки искомое CLOSED.

назовите кнопки совсем по разному.
Или можно просто поменять местами две части кода. С начало PullCLOSED, затем CLOSED. Но нужно добавить return в тело первого, чтобы второй не выполнился следом за первым.
 

sergeysv

Активный участник
все просто. вы нажимаете кнопку PullCLOSED, верно?
И обзывал по всякому и местами менял...не хочет---видит только правую кнопку..
Только на неё реагирует..даже местами код переставил и всё равно работает только кнопка
"CLOSED" ..........
 

Вложения

  • 888.mq4
    13,8 КБ · Просмотры: 10

mobidik

-----
спасибо за помощь,не думал что такой большой код получится:facepalm:,то есть проще и короче уже нельзя?

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

Milord

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

согласен - лучше качественно и надежно!
хотел погонять в тестере этот мартин,но компилятор ругается на код, видимо ошибки где то, в моем варианте до того не ругался..,вот что он пишет:
 

Вложения

  • Screenshot - 31_05.jpg
    Screenshot - 31_05.jpg
    7,6 КБ · Просмотры: 58
Верх