Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 984

 
Ivan Butko:

Если знаете, какое условие добавить или как реализовать (если это просто), прошу поделиться. 

могу, но проверять как работает не интересно, вот набросал

void OnTick()
{  static int ticket = -1;
   while(!IsStopped() &&ticket<0)
   {  if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())
      {  
         RefreshRates();
         ticket = OrderSend("EURUSD", OP_SELL, 0.01, Bid, 3, 0, 0, "", 0, 0, clrRed);
         if(ticket > 0) break; 
      }
   Sleep(123); 
   }
}
 
Igor Makanu:

могу, но проверять как работает не интересно, вот набросал

Игорь, спасибо. И не нужно проверять, я сам, конечно же. 

А без ожидания тика тоже можно как-то?

Чтобы запрос на открытие пошел сразу же при "толчке"-нажатии. 

Вот как кнопка стандартная в терминале "бай/сел" быстрого открытия сделок (слева-сверху графика). На неё нажимаешь и селка моментально открывается. Всё, что нужно, это чтобы вместо одной сделки открылась корзина ордеров, без ожидания тика. 

Получается две реализации (как я вижу):
1) либо кнопка (подобная) на графике, открывающая корзину,
2) либо советник. Советник мне кажется удобнее, поскольку он может быстрее повторить запрос на открытие (если проблемы), нежели я.



UPD

Ваш код работает, открывает при новом тике, круто, сспасибо)


UPD

Еще вспомнил: у копировальщиков есть параметр "ms", в нем можно ставить время проверки. И если у мастера открыта сделка, тот чуть ли не от 1 мс  слэйв может подавать запрос на открытие сделки. Т.е., моментальное открытие реализуемо 

 
Igor Makanu:

могу, но проверять как работает не интересно, вот набросал

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

int OnInit()

  {

//---

   static int ticket = -1;

   while(!IsStopped() &&ticket<0)

   {  if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())

      {  

         RefreshRates();

         ticket = OrderSend("EURUSD", OP_SELL, 0.01, Bid, 3, 0, 0, "", 0, 0, clrRed);

         if(ticket > 0) break; 

      }

   Sleep(1); 

   }

//---

   return(INIT_SUCCEEDED);

  }

------------------

А то, вроде работает, как задумано...
 
Ivan Butko:



А то, вроде работает, как задумано...

не самый лучший вариант.... тогда так хоть напишите

#property strict
int ticket = -1;
int OnInit()
{  if(ticket < 0) SendMyOrder();
   return(INIT_SUCCEEDED); 
}
//+------------------------------------------------------------------+
void OnTick()
{
   if(ticket < 0) SendMyOrder();
}
//+------------------------------------------------------------------+
void SendMyOrder()
{  while(!IsStopped() && ticket < 0)
   {  if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())
      {  RefreshRates();
         ticket = OrderSend("EURUSD", OP_SELL, 0.01, Bid, 3, 0, 0, "", 0, 0, clrRed);
         if(ticket > 0) break; 
      }
      Sleep(123); 
   } 
}
//+------------------------------------------------------------------+

но первый вариант должен четко работать если бросили на чарт и нажали кнопку автоторговля когда считаете нужным "дежурить"

ЗЫ: удалить бы советник после выставления ордера, чтобы терминал не подвесил, тогда так напишите:

void OnTick()
{
   if(ticket < 0) SendMyOrder();
   if(ticket > 0) ExpertRemove();
}
 
Igor Makanu:

не самый лучший вариант.... тогда так хоть напишите

но первый вариант должен четко работать если бросили на чарт и нажали кнопку автоторговля когда считаете нужным "дежурить"

ЗЫ: удалить бы советник после выставления ордера, чтобы терминал не подвесил, тогда так напишите:

большое спасибо
 

Отлично! Тестирование вариантов продолжается. Вариант Владимира и Игоря получился довольно быстрым. На практике оказалось, что нажатие на кнопку быстрой покупки сделки открываются быстрее, чем при советнике. И у того, и у другого варианта есть плюсы и минусы.  Любопытно ещё, что если в советнике поочередно прописать, какие пары открывать, то они открываются одна за другой поочередно и очень медленно... а если поставить 7 советников на каждый график (вроде как больше негрузки), то наоборот - все сделки открываются моментально, НЕпоочередно, без задержек между ордерами (но, в начале все равно есть какой-то промежуток в полсекунды-секунду. )

Хочу попробовать кнопку на графике, нашёл мануал, но в нем расписывается только координаты и прочее. Подскажите, пожалуйста, где в скрипте объякта "кнопка" прописать код открытия сделки? Чтобы нажать на нее на графике и сделка открылась. Как в стандартной кнопке МТ быстрой покупке/продажи. 

Или как модернизировать Trade Panel, чтобы открывала корзину ордеров?

 
Помогите пожалуйста с этим
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам
  • 2019.10.14
  • www.mql5.com
В этой ветке я хочу начать свою помощь тем, кто действительно хочет разобраться и научиться программированию на новом MQL4 и желает легко перейти н...
 
Ivan Butko:

Хочу попробовать кнопку на графике, нашёл мануал,

мануал не искал, но кнопку нарисовал )))

#property copyright "IgorM"
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
input string   sym1 = "EURUSD";
input string   sym2 = "GBPUSD";
input string   sym3 = "USDCAD";
input string   sym4 = "USDJPY";
input string   sym5 = "AUDUSD";
#include <Controls\Button.mqh>
CButton ButtonSend;

string sym[5];
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   sym[0] = sym1;
   sym[1] = sym2;
   sym[2] = sym3;
   sym[3] = sym4;
   sym[4] = sym5;
   ButtonSend.Create(0, "ButtonSend" + _Symbol, 0, 10, 50, 100, 90);
   ButtonSend.Color(clrRed);
   ButtonSend.Text("Kill Forex!");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   static int ticket[5] = {-1, -1, -1, -1, -1 };
   if(ticket[0] > 0 && ticket[1] > 0 && ticket[2] > 0 && ticket[3] > 0 && ticket[4] > 0) return;
   if(ButtonSend.Pressed())
     {
      ButtonSend.Pressed(false);
      Print("Start OrderSend()");
      while(!IsStopped())
        {
         if(TerminalInfoInteger(TERMINAL_CONNECTED) && TerminalInfoInteger(TERMINAL_TRADE_ALLOWED) && !IsTradeContextBusy())
           {
            RefreshRates();
            for(int i = 0; i < 5; i++)
              {
               if(sym[i] == "") ticket[i] = INT_MAX;
               if(ticket[i] > 0) continue;
               ticket[i] = OrderSend(sym[i], OP_SELL, 0.01, SymbolInfoDouble(sym[i],SYMBOL_BID), 3, 0, 0, "", 0, 0, clrRed);
              }
           }
         if(ticket[0] > 0 && ticket[1] > 0 && ticket[2] > 0 && ticket[3] > 0 && ticket[4] > 0)  break;
         Sleep(123);
        }
     }
  }
//+------------------------------------------------------------------+

если в настройках символа будет "" ,то не открываем 0.01 лота по этому символу, настройку лота не делал, ибо как бы топик про то как научить, а не искать кто сделает, попробуйте сами прикрутить если нужно ;)

 
Igor Makanu:

мануал не искал, но кнопку нарисовал )))

если в настройках символа будет "" ,то не открываем 0.01 лота по этому символу, настройку лота не делал, ибо как бы топик про то как научить, а не искать кто сделает, попробуйте сами прикрутить если нужно ;)

Спасибо огромное, Игорь! Оперативно и по существу

буду пробовать

 
Igor Makanu:

Странно, если в одном советнике, то открывает сделки одну за другой по каждой указанной валютной паре... с промежутком времени. А когда ставишь на 5 разных графиков с разной валютной парой (symbol(0)), то все 5 сделок открываются одновременно и моментально при нажатии автоторговли. 

Не подскажите, что это может быть и как исправить? Чтобы все было в одном советнике и на одном графике (чтобы кнопка на графике открывала все пары так же быстро, как при активации "автоторговли" с несколькими советниками, как в изначальном варианте)

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