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

 
DanilaMactep #:

Всем добрый день. Пытаюсь переделать код функции по определению появления новой свечи на графике на код без функции. Мне нужно чтобы Print в он тике вывелся только один раз когда появится новая свеча. пишу это вот так

Такой вариант не работает- принтов выводиться сильно много, а не один на новой свече. Что я делаю не так? И как правильно надо писать чтобы появилась новая свеча- вывелся один принт и ждём следующую новую свечу?


//+------------------------------------------------------------------+
//|                                             25-IS_NEW_CANDLE.mq4 |
//|                                                    ДАНЯ ГАГАРКИН |
//|                                     https://vk.com/danila_mastep |
//+------------------------------------------------------------------+
#property copyright "ДАНЯ ГАГАРКИН"
#property link      "https://vk.com/danila_mastep"
#property version   "1.00"
#property strict
int count_bars = 0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    bool flag_new_candle= false;
    if(count_bars != Bars)
    {
      count_bars= Bars;
      flag_new_candle= true;
    }
  
    if(flag_new_candle==true)
    {
      Print("НАЧАЛИ ВЫПОЛНЯТЬ КОД В ОН ТИКЕ");
    }
   
  }
 
DanilaMactep #:

Всем добрый день. Пытаюсь переделать код функции по определению появления новой свечи на графике на код без функции. Мне нужно чтобы Print в он тике вывелся только один раз когда появится новая свеча. пишу это вот так

Такой вариант не работает- принтов выводиться сильно много, а не один на новой свече. Что я делаю не так? И как правильно надо писать чтобы появилась новая свеча- вывелся один принт и ждём следующую новую свечу?

DanilaMactep #:
У Ростеслава наверно тоже рабочее решение- я просто код для видео урока делаю, и там массивов ещё рано касаться. Большое спасибо за подсказку что не ту переменную истиной делаю- исправил это дело и всё завелось)))

Ну что, допрыгались ?

получите видеоуроки от школьных прогульщиков

 
.
 
Maxim Kuznetsov #:

Ну что, допрыгались ?

получите видеоуроки от школьных прогульщиков

Весело)
 
Tretyakov Rostyslav #:
Весело)

Блин, смеялся от души, но Дане можно)))

 

здравствуйте всем!

сделал себе закрывашку ордеров с кнопки с экрана.

Всё работает. Но не понимаю как сделать функцию, чтобы если есть открытые ордера по символу, то цвет кнопки (и надпись на кнпке) менялись.

подскажите пожалуйста как увязать?

//+------------------------------------------------------------------+
//|                                                    Close All.mq4 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023"
#property link      ".com"
#property version   "1.0"
#property strict
// Глобальные переменные
 
string AC;
datetime Start;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
 ObjectsDeleteAll(0,"lab_");
   Start  = TimeCurrent();
   AC = StringConcatenate(" ", AccountCurrency());

 int Y=20;
   CreateButton(0,"lab_Button",0,79,Y,77,25,CORNER_RIGHT_UPPER,"Советник остановлен","Сделок нет","Arial Black",8,clrWhite,clrRed,false,false,false,false,false,0);Y += 35;
   DrawLABEL("lab_Торговля"   ,1,5,Y,clrRed,"Торговля ");Y += 20;
   DrawLABEL("lab_Take"       ,1,5,Y,clrLime,"Profit: ");
   return (INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
// Обновляем текст на лейблах
   DrawLABEL("lab_Take"       ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
   CountOrders()>0........
//+------------------------------------------------------------------+
//| Надпись под кнопкой(указывает вклчена или выключена              |
//| авто-торговля на самом терминале                                 |
//+------------------------------------------------------------------+
if (!IsTradeAllowed()) 
     {DrawLABEL("lab_Торговля",0,0,0,clrRed,"Авто-торговля   ОТКЛ"); return;} 
   else
     {DrawLABEL("lab_Торговля",0,0,0,clrLime,"Авто-торговля ВКЛ");}
  }
//+------------------------------------------------------------------+
//| Внешний вид кнопки и текст надписей на ней                       |
//+------------------------------------------------------------------+
void TradeButton()
  {
   if(ObjectGetInteger(0,"lab_Button",OBJPROP_STATE)==true)
     {
      ObjectSetInteger(0,"lab_Button", OBJPROP_BGCOLOR,clrGreen);
      ObjectSetString (0,"lab_Button", OBJPROP_TOOLTIP,"Советник запущен");
      ObjectSetString (0,"lab_Button", OBJPROP_TEXT,"Торгует");
     }
   if(ObjectGetInteger(0,"lab_Button",OBJPROP_STATE)==false)
     {
      ObjectSetInteger(0,"lab_Button", OBJPROP_BGCOLOR,clrRed);
      ObjectSetString (0,"lab_Button", OBJPROP_TOOLTIP,"Советник остановлен");
      ObjectSetString (0,"lab_Button", OBJPROP_TEXT,"Сделок нет");
      Start = TimeCurrent();
     }
  }
//+------------------------------------------------------------------+
//| Подсчет открытых ордеров                                         |
//+------------------------------------------------------------------+
int CountOrders() 
  {
   int cnt=0, i=OrdersTotal()-1;
   for(int pos=i;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol) cnt++;
        }
     }
   return(cnt);
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   int _ticket=0;
   if(sparam=="lab_Button") 
     {
      int total=OrdersTotal();
      int i = 0;
      for(i = total; i >=0; i--)
        {
         if(OrderSelect(i,SELECT_BY_POS) &&  OrderSymbol()==Symbol())
           {

            if(OrderType()==OP_BUY || OrderType()==OP_SELL)
              {
               _ticket = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_ASK),5);
               _ticket = OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),5);
              }
           }
        }
     }
   }
//+------------------------------------------------------------------+
//|  Функция возвращает по символу и магику                          |
//|  размер профита с учетом комиссии и свопа с начала цикла         |
//+------------------------------------------------------------------+
double GetProfitFromStart()
  {
   double cp=0;
    for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol()==_Symbol )
           {
            if(OrderType()==OP_BUY || OrderType()==OP_SELL) {cp=OrderProfit()+OrderCommission()+OrderSwap();}
           }
        }
     }
   return(cp);
  }
//+------------------------------------------------------------------+
//| Установка цвета                                                  |
//+------------------------------------------------------------------+
color Color(bool P,color a,color b)
  {
   if (P) return(a);
   else return(b);
  }
//+------------------------------------------------------------------+
//| Установка лейблов/текста                                         |
//+------------------------------------------------------------------+
void DrawLABEL(string name, int CORNER, int X, int Y, color clr, string Name)
  {
   if (ObjectFind(0,name)!=0)
     {
      ObjectCreate(0,name, OBJ_LABEL, 0, 0, 0);
      ObjectSet(name, OBJPROP_CORNER, CORNER);
      ObjectSet(name, OBJPROP_XDISTANCE, X);
      ObjectSet(name, OBJPROP_YDISTANCE, Y);
     }
   ObjectSetText(name,Name,10,"Arial",clr);
  }
//+------------------------------------------------------------------+
//| Создает кнопку                                                   |
//+------------------------------------------------------------------+
bool CreateButton(const long              chart_ID=0,               // ID графика
                  const string            name="Button",            // имя кнопки
                  const int               sub_window=0,             // номер подокна
                  const int               x=0,                      // координата по оси X
                  const int               y=0,                      // координата по оси Y
                  const int               width=50,                 // ширина кнопки
                  const int               height=18,                // высота кнопки
                  const int               corner=0,                 // угол графика для привязки
                  const string            tool="TOOLTIP",           // TOOLTIP
                  const string            text="Button",            // текст
                  const string            font="Arial",             // шрифт
                  const int               font_size=10,             // размер шрифта
                  const color             clr=clrBlack,             // цвет текста
                  const color             back_clr=C'236,233,216',  // цвет фона
                  const bool              state=false,              // нажата/отжата
                  const bool              back=false,               // на заднем плане
                  const bool              selection=false,          // выделить для перемещений
                  const bool              selected=false,           // выделить для перемещений
                  const bool              hidden=true,              // скрыт в списке объектов
                  const long              z_order=0)                // приоритет на нажатие мышью
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим кнопку
   if(!ObjectCreate(chart_ID,name,OBJ_BUTTON,sub_window,0,0))
     {
      Print(__FUNCTION__, ": не удалось создать кнопку! Код ошибки = ",GetLastError()); return(false);
     }
   ObjectSetInteger(chart_ID,name,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(chart_ID,name,OBJPROP_YDISTANCE,y);
   ObjectSetInteger(chart_ID,name,OBJPROP_XSIZE,width);
   ObjectSetInteger(chart_ID,name,OBJPROP_YSIZE,height);
   ObjectSetInteger(chart_ID,name,OBJPROP_CORNER,corner);
   ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,tool);
   ObjectSetString(chart_ID,name,OBJPROP_TEXT,text);
   ObjectSetString(chart_ID,name,OBJPROP_FONT,font);
   ObjectSetInteger(chart_ID,name,OBJPROP_FONTSIZE,font_size);
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_BGCOLOR,back_clr);
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
   ObjectSetInteger(chart_ID,name,OBJPROP_STATE,state);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selected);
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение
   return(true);
  }
//+------------------------------------------------------------------+
 
законопослушный гражданин #:

здравствуйте всем!

сделал себе закрывашку ордеров с кнопки с экрана.

Всё работает. Но не понимаю как сделать функцию, чтобы если есть открытые ордера по символу, то цвет кнопки (и надпись на кнпке) менялись.

подскажите пожалуйста как увязать?

if(CountOrders()>0)
   ObjectSetInteger(0,"lab_Button", OBJPROP_BGCOLOR,clrGreen);
else
   ObjectSetInteger(0,"lab_Button", OBJPROP_BGCOLOR,clrRed);
 
Tretyakov Rostyslav #:

спасибо. попробую!

 
Tretyakov Rostyslav #:

в итоге вот так сделал:

void OnTick()
  {
// Обновляем текст на лейблах
   DrawLABEL("lab_Take"       ,1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
   
 if(CountOrders()>0)
   {
    ObjectSetInteger(0,"lab_Button", OBJPROP_BGCOLOR,clrGreen);
    ObjectSetString (0,"lab_Button", OBJPROP_TOOLTIP,"Советник запущен");
    ObjectSetString (0,"lab_Button", OBJPROP_TEXT,"Торгует");
   }
 else
   {
   ObjectSetInteger(0,"lab_Button", OBJPROP_BGCOLOR,clrRed);
   ObjectSetString (0,"lab_Button", OBJPROP_TOOLTIP,"Советник остановлен");
   ObjectSetString (0,"lab_Button", OBJPROP_TEXT,"Сделок нет");
   }

всё работает, и надписи тоже меняются. Спасибо еще раз!

 

Прошу помощи зала :)

Нужно заменить в коде через #define функцию OrderSend на пользовательскую функцию, которая будет идентична  OrderSend, но в ней будет исполняться предварительно дополнительный код.

Написал такой код

#define OrderSend OrderSend_02
bool OrderSend_02
(
   MqlTradeRequest&  request_02,      // структура запроса
   MqlTradeResult&   result_02        // структура ответа
)
{
bool Rezf=false;
   Rezf=OrderSend(request_02,result_02);
   return(Rezf);
}

Но получаю ошибки

2023.03.07 20:40:32.715 2023.01.27 13:00:00   Order Send retry no: 4
2023.03.07 20:40:32.715 2023.01.27 13:00:00   Order Send retry no: 5
2023.03.07 20:40:34.473 2023.01.31 13:00:00   Order Send retry no: 2
2023.03.07 20:40:34.473 2023.01.31 13:00:00   Order Send retry no: 3
2023.03.07 20:40:34.473 2023.01.31 13:00:00   Order Send retry no: 4

Что не так делаю, подскажите, пожалуйста!

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