Индикаторы: showSwap - страница 2

 
Renat Akhtyamov #:

судя по распечатке, раз в минуту получать данные по свопу напрашивается

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

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

Как делать, не главный вопрос, главный,  чтобы данные были правильными на момент обращения к ним.

 

переделал на каждый тик.

сравнивать со старым значение смысла нет, просто заменяем на новое.

 
Yuriy Yepifanov #:

переделал на каждый тик.

сравнивать со старым значение смысла нет, просто заменяем на новое.

В анатации к индикатору используется фраза:"показывает SWAP на графике инстумента по этому инстументу."

В коде это выглядит где то так:

//+------------------------------------------------------------------+
//| GetSwapParameters()                                              |
//| показывает SWAP на графике инстумента по этому инстументу.       |
//+------------------------------------------------------------------+
void GetSwapParameters()
{
  //--- showSwap простой индикатор. показывает SWAP на графике инстумента по этому инстументу.
  LabelTextChange("yy_labelinfo3",  "SWAPLONG:"+ Symbol() +":" + DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),2));
  LabelTextChange("yy_labelinfo4",  "SWAPSHORT:"+ Symbol() +":" + DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),2));  
}

в

 #property description   "show оrders swap" // Переведём дословно, как "показать своп ордеров."

Если ошибся, поправьте.

Дальше в функции:

//+------------------------------------------------------------------+
//|   checkOrders                                                    |
//+------------------------------------------------------------------+
int checkOrders()
{
   ResetLastError();
   int co = OrdersTotal();
   double sellswap = 0;
   double buyswap  = 0;
   //---
   for (int i = co - 1; i >= 0; i--)
   {
      //---
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      { 
         //---
         if(OrderSymbol() != Symbol())
         {
            //---
            if(OrderMagicNumber() != MAGIC && 0 != MAGIC)
            { 
               //---
               if (OrderType() == OP_BUY)
               {
                 buyswap  += OrderSwap();  // <-------------------------- было sellswap
               }
               //---
               if (OrderType() == OP_SELL) 
               {
                 sellswap += OrderSwap();  // <-------------------------- было buyswap
               }
            }
         }
      }
   }
   
   //if (co)
   //{
      LabelTextChange("yy_labelinfo1",  "Суммарный начисленный своп SELL ордерам инструмента:" + DoubleToStr(sellswap,2));
      LabelTextChange("yy_labelinfo2",  "Суммарный начисленный своп BUY ордерам инструмента:"  + DoubleToStr(buyswap,2));
   //}
  
   return 0;
}

считаем сумму начисленного свопа,  по открытым ордерам инструмента, разного типа, и выводим значения на чарт.

Если не будет ордеров, то и на чарт выводить нечего будет, согласны?

Поэтому требуется уточнить вопрос:"Что всетаки выводим?"


Я тут немного поковырял код чтобы  увидеть разницу между авторским checkOrders() и моим GetSwapParameters() на чарте.

showSwap.mq4:

//+------------------------------------------------------------------+
//|                                                     showSwap.mq4 |
//|                                                   Copyright 2024 |
//|                                                 eurweb@gmail.com |
//|                                                       it-yy.site |
//|                                                 eurweb@gmail.com |
//+------------------------------------------------------------------+
#property copyright "it-yy.site Copyright 2024"
#property link      "it-yy.site"
#property link      "eurweb@gmail.com"
#property version   "1.20"
#property strict
#property indicator_chart_window
#property description   "show оrders swap"             // <-------------------------- 
#property description   "Contact  eurweb@gmail.com"
#property description   "WARNING: Use this software at your own risk."

//--- 
#include "showSwap.mqh"

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
   EventSetTimer(TIMER);
   ResetLastError();
   day_last = 0;
   initGui();
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Indicator deinitialization function                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   //--- delete the labels
   ObjectsDeleteAll(0, "yy");
   //--- reset the error value
   ResetLastError();
  }
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnTimer()
  {
    //---
    GetSwapParameters(); 
    checkOrders(); 
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   //--- Сумма начисленного свопа по ордерам инструмента, отдельно 
   //--- по типаам ордеров на покупку и продажу отдельно.
   //checkOrders();
   //---
    GetSwapParameters();  
   //--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

showSwap.mqh

//+------------------------------------------------------------------+
//|                                                     showSwap.mqh |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
/*
  void initGui()
  void GetSwapParameters()
  int  checkOrders()
  bool LabelTextChange()
  void PutLabel()
  void DrawBox()
  bool isNewDay()
*/

/// 22.03.2024 21:30
//--- input parameters
//input int   checktime    = 5; //checktime  in sec

//+------------------------------------------------------------------+
//| input parameter & Global variables                               |
//+------------------------------------------------------------------+
input int MAGIC = 0;             // MAGIC , if = 0 -> all
input int TIMER = 1;             // TIMER (sec):
input int x = 30;                // x coordinate 
input int y = 150;               // y coordinate
input const string admin_contact = "eurweb@gmail.com"; 
//--- 
int day_last = 0;
int n = 0;


//+------------------------------------------------------------------+
//| GetSwapParameters()                                              |
//| показывает SWAP на графике инстумента по этому инстументу.       |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
void GetSwapParameters()
{
  //--- showSwap простой индикатор. показывает SWAP на графике инстумента по этому инстументу.
  LabelTextChange("yy_labelinfo3",  "SWAPLONG:" + Symbol() +":" + DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),2));
  LabelTextChange("yy_labelinfo4",  "SWAPSHORT:" +Symbol() +":" + DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),2));  
}


//+------------------------------------------------------------------+
//|   checkOrders                                                    |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
int checkOrders()
{
   ResetLastError();
   int co = OrdersTotal();
   double sellswap = 0;
   double buyswap  = 0;
   //---
   for (int i = co - 1; i >= 0; i--)
   {
      //---
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      { 
         //---
         if(OrderSymbol() == Symbol())
         {
            //---
            if(OrderMagicNumber() == MAGIC )
            { 
               //---
               if (OrderType() == OP_BUY)
               {
                 buyswap += OrderSwap();
               }
               //---
               if (OrderType() == OP_SELL)
               {
                 sellswap += OrderSwap();
               }
            }
         }
      }
   }
   
   //if (co)
   //{
      LabelTextChange("yy_labelinfo1",  "Суммарный начисленный своп SELL ордерам инструмента: " + DoubleToStr(sellswap,2));
      LabelTextChange("yy_labelinfo2",  "Суммарный начисленный своп BUY ордерам инструмента: "  + DoubleToStr(buyswap,2));
   //}
  
   return 0;
}

//+------------------------------------------------------------------+
//| initGui function                                                 |
//+------------------------------------------------------------------+  
void initGui()
{
    //---
    ObjectsDeleteAll(0, "yy");
    //---
    DrawBox("yy_box1",x, 150, y, 50, clrGray, clrLightGray);
    //---                     +--------------------------
    //---                     |
    //---                     V 
    PutLabel("yy_labelinfo1","", x + 4 ,y + 5,  clrBlack); // <-------------------------- 
    PutLabel("yy_labelinfo2","", x + 4 ,y + 30, clrBlack); // <-------------------------- 
    //--- 
    PutLabel("yy_labelinfo3","", x + 4 ,y + 50, clrBlack); // <-------------------------- 
    PutLabel("yy_labelinfo4","", x + 4 ,y + 80, clrBlack); // <--------------------------                               
    
}

//+------------------------------------------------------------------+
//| LabelTextChange                                                  |
//+------------------------------------------------------------------+
bool LabelTextChange(string name,
                     string text, 
                     color clr = clrWhite)  // <-------------------------- 
{
   if(!ObjectSetString(0,name,OBJPROP_TEXT,text))
   {
      Print(__FUNCTION__,": Error = = ",GetLastError());
      return(false);
   }
   //---
   if (clr)  ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   //---
   return(true);
}


//+------------------------------------------------------------------+
//|   PutLabel                                                       |
//+------------------------------------------------------------------+
void PutLabel(string name,
              string text,
              int _x,            // <-------------------------- 
              int _y,            // <-------------------------- 
              color clr, 
              int corner = CORNER_LEFT_UPPER)
{
   if(ObjectFind(0,name) > -1) return;
   ObjectCreate(0,name,OBJ_LABEL,0,0,0);
   ObjectSetInteger(0,name,OBJPROP_XDISTANCE,_x);
   ObjectSetInteger(0,name,OBJPROP_YDISTANCE,_y);
   ObjectSetInteger(0,name,OBJPROP_CORNER,0);
   ObjectSetString(0,name,OBJPROP_TEXT,"");  // <-------------------------- 
   ObjectSetString(0,name,OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,name,OBJPROP_FONTSIZE,9);
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
   
   ObjectSetInteger(0,name,OBJPROP_CORNER,corner);
   /// ENUM_ANCHOR_POINT ANCHOR_RIGHT_UPPER Точка привязки в правом верхнем углу
   //--- установим способ привязки
   ///ObjectSetInteger(0,name, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
}



//+------------------------------------------------------------------+
//|   DrawBox                                                        |
//+------------------------------------------------------------------+
void DrawBox(string nm, 
             int _x, // <-------------------------- 
             int xsize, 
             int _y, // <-------------------------- 
             int ysize,  
             color BackColor = clrBlack, 
             color BorderColor = clrBlack, 
             int corner = CORNER_LEFT_UPPER )
{
  //---
  if(ObjectFind(0,nm) > -1) return;
  //---
  if(!ObjectCreate(0, nm, OBJ_RECTANGLE_LABEL, 0, 1, 1, 1, 1))
  {
    Print(__FUNCTION__,": не удалось создать прямоугольник! Код ошибки = ", GetLastError());
    return;
  }

  ObjectSetInteger(0, nm, OBJPROP_XDISTANCE, _x); // <-------------------------- 
  ObjectSetInteger(0, nm, OBJPROP_YDISTANCE, _y); // <-------------------------- 
  ObjectSetInteger(0, nm, OBJPROP_XSIZE, xsize);
  ObjectSetInteger(0, nm, OBJPROP_YSIZE, ysize);
  ObjectSetInteger(0, nm, OBJPROP_BGCOLOR, BackColor); // цвет фона
  ObjectSetInteger(0, nm, OBJPROP_BORDER_TYPE, BORDER_FLAT); // тип границы
  ObjectSetInteger(0, nm, OBJPROP_CORNER, corner); // угол привязки
  ObjectSetInteger(0, nm, OBJPROP_BORDER_COLOR, BorderColor); // цвет рамки
  ObjectSetInteger(0, nm, OBJPROP_BACK, false); // на заднем плане - true
  ObjectSetInteger(0, nm, OBJPROP_SELECTABLE, false); // перемещение метки мыщью, true - можно
  ObjectSetInteger(0, nm, OBJPROP_SELECTED, false); // выделение метки мышью, true - можно
  ObjectSetInteger(0, nm, OBJPROP_HIDDEN, true); // скрыть в списке объектов - true
}  
  
//+------------------------------------------------------------------+
//|   isNewDay()                                                     |
//+------------------------------------------------------------------+
bool isNewDay()
{
   if (Day() != day_last)
   {
      day_last = Day();
      return true;
   }
   return false;
}
//+------------------------------------------------------------------+

Правил код, и писал пост одновременно, поэтому, если где то, что то не совпадает, извиняюсь. ))) 

OnTimer()

Использовал чисто для проверки в выходные. )))

// <-------------------------- Подправил предупреждения и преобразование типов.
 
 // Переведём дословно, как "показать своп ордеров."


да, смысл индикатора, показать , сколько у юзера уже накопилось свопов по открытым ордерам.

 
buyswap  += OrderSwap();  // <-------------------------- было sellswap

это было бы грубейшей ошибкой)

было  buyswap =  buyswap + OrderSwap();

мне  такая форма записи больше нравится и она более наглядная

 
 ObjectSetString(0,name,OBJPROP_TEXT,"");  // <-------------------------- 

смысл этого я не понял.
и тогда теряется смысл в параметре

string text

так как он вообще не используется.


и зачем разделять на 2 файла  showSwap.mqh и showSwap.mql4 ?
 
LabelTextChange("yy_labelinfo1",  "Суммарный начисленный своп SELL ордерам инструмента: " + DoubleToStr(sellswap,2));


если написать более коротко

начисленный своп SELL ордерам инструмента:
Суммарный своп SELL ордеров:


или

Своп SELL ордеров

 
Yuriy Yepifanov #:

это было бы грубейшей ошибкой)

было  buyswap =  buyswap + OrderSwap();

мне  такая форма записи больше нравится и она более наглядная

Это дорогая операция

--

вот правильно:

buyswap += OrderSwap();
 
Yuriy Yepifanov #:


да, смысл индикатора, показать , сколько у юзера уже накопилось свопов по открытым ордерам.

Тогда в анатации изменяем фразу:"показывает SWAP на графике инстумента по этому инстументу."  на ту, которая не вводит в заблуждение пользователя.

Например: "Суммарный начисленный SWAPLONG/SWAPSHORT".....

 
Yuriy Yepifanov #:

это было бы грубейшей ошибкой)

было  buyswap =  buyswap + OrderSwap();

мне  такая форма записи больше нравится и она более наглядная

Тут смотрим оригинал-архив, или его приатаченую копию.

Файлы:
48660.zip  3 kb
Причина обращения: