0
Дело в том, что я еще ничего никуда не вписывал — эта конструкция даже с одной переменной profitToday уже работает неправильно. После того как отрисовываются все 10 «кирпичей», а значение переменной profitToday продолжает расти, тестер прекращает работу с ошибкой. Т.е. у данной системы нет условия, при котором советник продолжит работу когда все 10 кирпичей отрисуются. Последний нарисованный кирпич не должен быть окончанием работы советника, нужно какое-то условие, при котором после отрисовке 10-го кирпича не зависимо от значения переменной profitToday советник не выдавал бы ошибки в тестере. Сейчас на 10-м кирпиче всё блокируется.
Пока надо как-то вылечить это, но я не могу сообразить как создать нужное условие…
Я ранее писал, что у меня есть рабочий вариант, который я сам слепил, но он очень громоздкий, там на каждый киприч отдельный объект, но там есть и условия на каждый кирпич
<b>if (profitToday > 0)</b>
          {                      
           ProText = "-";
          }
  ObjectCreate("label_object44", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object44", OBJPROP_CORNER, 3);
  ObjectSet("label_object44", OBJPROP_XDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_YDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_BACK, false);    
  ObjectSetText("label_object44", StringConcatenate(ProText), 42, "Arial", Red);

  <b>if (profitToday > 5.0)</b>
          {                      
           ProText2 = "-";
          }
  ObjectCreate("label_object45", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object45", OBJPROP_CORNER, 3); 
  ObjectSet("label_object45", OBJPROP_XDISTANCE, 10);
  ObjectSet("label_object45", OBJPROP_YDISTANCE, 17);
  ObjectSet("label_object45", OBJPROP_BACK, false);    
  ObjectSetText("label_object45", StringConcatenate(ProText2), 42, "Arial", OrangeRed);

И последний «кирпич» с условием if (profitToday > 45.0) — т.е. если значение profitToday > 45.0 то последний «кирпич» отрисуется, и не имеет значения до какой величины profitToday будет дальше расти, все будет работать.
В вашем варианте так пока что не получается…
avatar

FEEX

  • 3 октября 2023, 21:04
0
перед условием у нас есть еще
<code>int step=5;// шаг индикации
int i=(int)(profitToday/step);</code>

где как раз и выбирается переменная. И тут непонятно.
у меня есть две переменные: profitToday и Pr_01
т.е у меня должна появиться еще строка
<code>int i=(int)(Pr_01/step);</code>

как её добавить в эту конструкцию, чтобы работало?

P.S. При добавлении строки objectCreate(«ind2»+string(i),40+(i*7),30);
сразу ошибка: 'i' — undeclared identifier

P.S.2. еще одна проблемка: выставил ради интересa step=3, шкала заполнилась на макс и тестер отключился с ошибкой в журнале

2023.10.03 11:46:14.937 2023.01.03 13:21:27 Testing pass stopped due to a critical error in the EA
2023.10.03 11:37:20.811 2023.01.03 10:52:38 ZolotoAM2__4 EURUSD,H1: array out of range in 'ZolotoAM2__4.mq4' (631,52)

Как я понял, у нас стоит ограничение на 10 «кирпичей», при попытке нарисовать 11-й — ошибка.
это где-то тут прописано:
<code>void MeterCreate()
  {
   for(int i=0; i<10; i++)
    // objectCreate("ind"+string(i),10,5+(i*7)); // вертикальная шкала
   objectCreate("ind"+string(i),10+(i*17),5); // горизонтальная шкала  
  }</code>


Как оставить 10 кирпичей, т.е. не рисовать 11-й, а просто разрешить работать дальше без ограничений?
avatar

FEEX

  • 2 октября 2023, 20:00
0
Работает))) И вертикальная шкала и горизонтальная!!))

Единственный момент: для горизонтального вывода в этой с троке
<code>objectCreate("ind"+string(i),30+(i*7),30);</code>

умножение не на 7 нужно, а больше, я 17 поставил, тогда расстояния между «кирпичами» без наложения друг на друга получается (см. скрин)
Еще раз спасибо))

P.S. Еще хотел спросить: по этой схеме мы выводим шкалу для одного параметра. А если мы хотим вывести индикацию одновременно для двух, или трех параметров? Как это сделать с использованием этой схемы?)
avatar

FEEX

  • 2 октября 2023, 14:57
0
Спасибо!)) Это очень даже компактно выглядит) Я попробую применить, и разобраться как это работает. Раньше не встречал таких конструкций…
avatar

FEEX

  • 2 октября 2023, 09:27
0
выглядит компактнее, чем у меня получилось) только у вас все кирпичики сразу отрисовались при запуске, а мне надо отрисовка в зависимости от величины того или иного значения, например текущего профита за день.

я, как бы, сделал — первый кирпич рисуется если профит > 0, второй если > 5, profit > 10, profit > 15 и т.д.
Но слишком громоздкая конструкция получилась…
<code>if (profitToday > 0)
          {                      
           ProText = "-";
          }
  ObjectCreate("label_object44", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object44", OBJPROP_CORNER, 3);
  ObjectSet("label_object44", OBJPROP_XDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_YDISTANCE, 10);
  ObjectSet("label_object44", OBJPROP_BACK, false);    
  ObjectSetText("label_object44", StringConcatenate(ProText), 42, "Arial", Red);</code>

это только один кирпич, а всего их 10…
Как сделать компактнее — я хз…
avatar

FEEX

  • 2 октября 2023, 01:19
0
т.е прямоугольник это обычное тире?))
И одно такое тире выводится на график через ObjectCreate?
И если таких тире должно быть 10, то для каждого создается свой ObjectCreate?
avatar

FEEX

  • 1 октября 2023, 23:19
0
я не понимаю как эти прямоугольники отрисовать на графике. как такую шкалу отрисовать. Я смотрел код индюка, но не понял как именно получается такой прямоугольник… А потом еще их в шкалу загнать надо, т.е. это для каждого прямоугольника свой объект создавать что ли?
avatar

FEEX

  • 1 октября 2023, 22:15
0
8-) 
avatar

FEEX

  • 30 сентября 2023, 11:57
0

вроде тут)
avatar

FEEX

  • 30 сентября 2023, 10:15
+1
отправил. Если снова не будет работать, то это что-то у вас… У меня всё работает)

P.S. Вообще не плохо было бы, чтобы или кол-во символов в сообщении увеличили (актуально для кода), или прикрепление файлов.
avatar

FEEX

  • 27 сентября 2023, 17:58
+1
вторая часть
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastBuyPrice()
  {
   double p=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && OrderMagicNumber()==Magic)
           {
            p=OrderOpenPrice();
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double FindLastSellPrice()
  {
   double p=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderMagicNumber()==Magic)
           {
            p=OrderOpenPrice();
            break;
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifyOrders()
  {
   bool mod=1;
   double allb=0,alls=0;
   double countb=0,counts=0,tp=0,sl=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               allb+=OrderOpenPrice()*OrderLots();
               countb+=OrderLots();
              }

            if(OrderType()==1)
              {
               alls+=OrderOpenPrice()*OrderLots();
               counts+=OrderLots();
              }
           }
        }
     }
   if(countb>0)
      allb=NormalizeDouble(allb/countb,_Digits);
   if(counts>0)
      alls=NormalizeDouble(alls/counts,_Digits);

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0)
              {
               if(TakeProfit>0)
                  tp=NormalizeDouble(allb+TakeProfit*_Point,_Digits);
               if(StopLoss>0)
                  sl=NormalizeDouble(allb-StopLoss*_Point,_Digits);
               if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
                  mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
              }
            else
               if(OrderType()==1)
                 {
                  if(TakeProfit>0)
                     tp=NormalizeDouble(alls-TakeProfit*_Point,_Digits);
                  if(StopLoss>0)
                     sl=NormalizeDouble(alls+StopLoss*_Point,_Digits);
                  if(OrderTakeProfit()!=tp || OrderStopLoss()!=sl)
                     mod=OrderModify(OrderTicket(),OrderOpenPrice(),sl,tp,0,Yellow);
                 }
           }
        }
     }
  }

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if (eaComment1 == TRUE) Display_Info();
   
   if(AllProfit()>Profit && Profit>0)
      CloseAll();

   if(Buy && CountTrades(0)<1)
     {
      PutOrder(0,Ask);
     }

   if(Sell && CountTrades(1)<1)
     {
      PutOrder(1,Bid);
     }

   if(CountTrades()>0 && CountTrades()<Count)
     {
      if(FindLastBuyPrice()-Ask>Steps(0)*_Point)
        {
         PutOrder(0,Ask);
         ModifyOrders();
        }

      if(Bid-FindLastSellPrice()>Steps(1)*_Point)
        {
         PutOrder(1,Bid);
         ModifyOrders();
        }
     }
}

//=============================================================================
void Display_Info() {

  ObjectCreate("label_object1", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object1", OBJPROP_CORNER, 3);
  ObjectSet("label_object1", OBJPROP_XDISTANCE, 10);  
  ObjectSet("label_object1", OBJPROP_YDISTANCE,5);
  ObjectSet("label_object1", OBJPROP_BACK, false);   
  ObjectSetText("label_object1", "Profit: " + DoubleToString (AllProfit(),2), FontSize, "Verdana", TextColour);

  }
//+------------------------------------------------------------------+
avatar

FEEX

  • 27 сентября 2023, 17:23
+2
первая часть…
//+------------------------------------------------------------------+
//|                                                  Usrednitel4.mq4 |
//|                                              Copyright 2023, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern double PLot       = 0.1;      // прибавление лота
extern double MaxLot     = 5;        // максимальный лот
extern double Profit     = 11;       // профит

extern int StopLoss      = 0;        // лось
extern int TakeProfit    = 0;        // язь

extern int Step          = 333;      // шаг
extern int PStep         = 50;       // добавка к шагу

extern int Count         = 20;       // число поз
extern int Slip          = 30;       // реквот
extern int Magic         = 123;      // магик

extern int Delta         = 2000;     // зона работы

extern bool Buy          = 1;        // Buy
extern bool Sell         = 1;        // Sell

extern bool eaComment1   = TRUE;     // ПОКАЗ ИНФО
extern int FontSize      = 22;       // размер шрифта
extern color TextColour  = DeepSkyBlue; // цвет текста

extern string Comm       = "Quadro";

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectDelete("label_object1");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0)
         sl=NormalizeDouble(price+StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price-TakeProfit*_Point,_Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0)
         sl=NormalizeDouble(price-StopLoss*_Point,_Digits);
      if(TakeProfit>0)
         tp=NormalizeDouble(price+TakeProfit*_Point,_Digits);
     }

   r=OrderSend(NULL,type,Lot(type),NormalizeDouble(price,_Digits),Slip,sl,tp,Comm,Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//| Профит всех ордеров по типу ордера                               |
//+------------------------------------------------------------------+
double AllProfit(int ot=-1)
  {
   double pr=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }

            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               pr+=OrderProfit()+OrderCommission()+OrderSwap();
              }
           }
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//| Подсчет позиций                                                  |
//+------------------------------------------------------------------+
int CountTrades(int ot=-1)
  {
   int count=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
               count++;
            if(OrderType()==1 && (ot==1 || ot==-1))
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot(int type)
  {
   double lot=Lots;

   if(CountTrades(type)>0)
     {
      lot=NormalizeDouble(Lots+(PLot*CountTrades(type)),2);
     }

   if(lot>MaxLot)
      lot=Lots;

   return(lot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int Steps(int type)
  {
   int st=Step;

   if(CountTrades(type)>0)
     {
      st=Step+PStep*CountTrades(type);
     }

   return(st);
  }
//+------------------------------------------------------------------+
//| Горизонтальная линия                                             |
//+------------------------------------------------------------------+
void PutHLine(string name,double p,color clr)
  {
   ObjectDelete(0,name);
   ObjectCreate(0,name,OBJ_HLINE,0,0,p);
//--- установим цвет линии
   ObjectSetInteger(0,name,OBJPROP_COLOR,clr);
//--- установим толщину линии
   ObjectSetInteger(0,name,OBJPROP_WIDTH,1);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl=1;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,_Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,_Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int FindOrderType()
  {
   int type=0;

   for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            type=OrderType();
            break;
           }
        }
     }
   return(type);
  }
avatar

FEEX

  • 27 сентября 2023, 17:22
+1
1. Вместо этой строки: extern int FontSize = 22; // размер шрифта
вставить это:
extern bool eaComment1   = TRUE;     // ПОКАЗ ИНФО
extern int FontSize      = 22;       // размер шрифта
extern color TextColour  = DeepSkyBlue; // цвет текста

2. найдите это:
void OnDeinit(const int reason)
{
Comment("");
}
и сделайте так:
void OnDeinit(const int reason)
  {
   Comment("");
   ObjectDelete("label_object1");
  }

3. Удалите это:
void PutLabel(string nm,string text,int x,int y)
  {
//--- создадим текстовую метку
   ObjectCreate(0,nm,OBJ_LABEL,0,0,0);
//--- установим координаты метки
   ObjectSetInteger(0,nm,OBJPROP_XDISTANCE,x);
   ObjectSetInteger(0,nm,OBJPROP_YDISTANCE,y);
//--- установим угол графика, относительно которого будут определяться координаты точки
   ObjectSetInteger(0,nm,OBJPROP_CORNER,3);
//--- установим текст
   ObjectSetString(0,nm,OBJPROP_TEXT,text);
//--- установим шрифт текста
   ObjectSetString(0,nm,OBJPROP_FONT,"Arial");
//--- установим размер шрифта
   ObjectSetInteger(0,nm,OBJPROP_FONTSIZE,FontSize);
//--- установим цвет
   ObjectSetInteger(0,nm,OBJPROP_COLOR,Red);
  }

4. После void OnTick()
{
вставьте это: if (eaComment1 == TRUE) Display_Info();
5. Удалите это:
PutLabel("Profit",string(AllProfit()),122,33);

   Comment("\n AllProfit: ",AllProfit());

6. В самом конце, после линии:
//+------------------------------------------------------------------+
вставьте это:
void Display_Info() {

  ObjectCreate("label_object1", OBJ_LABEL, 0, 0, 0);
  ObjectSet("label_object1", OBJPROP_CORNER, 3);
  ObjectSet("label_object1", OBJPROP_XDISTANCE, 10);  
  ObjectSet("label_object1", OBJPROP_YDISTANCE,5);
  ObjectSet("label_object1", OBJPROP_BACK, false);   
  ObjectSetText("label_object1", "Profit: " + DoubleToString (AllProfit(),2), FontSize, "Verdana", TextColour);

  }


Если сделаете всё правильно получите это:


В настройках можете менять размер шрифта (хоть на весь экран), И цвет шрифта… Так же можете отключить показ инфо.
avatar

FEEX

  • 27 сентября 2023, 15:34
0
да, точно) просмотрел, спасибо!))) Но этот вопрос уже решили, там уже этот момент учтен)
avatar

FEEX

  • 23 сентября 2023, 00:42
0
это уже на любителя)) хотя для просадки, наверное, будет достаточно добавить инфу на график: текущая просадка и макс. просадка. Мне интересно было сделать цену, не процент, а именно вычислить цену стопаута и вывести её в инфу на график, плюс линию отрисовать на цене. Если совсем заморочиться, можно еще и цену маржинкола))
Понятно, что сова от этого лучше торговать не начнет, это чисто чтобы было)) Лучше, если оно есть, чем если этого нет)
avatar

FEEX

  • 22 сентября 2023, 23:15
0
Прикольная штука, но нужен открытый код. Он есть?)
И мне не нужен индикатор, мне нужно это реализовать в советнике)
Уже сделали даже) только есть нюансы… Я ниже описал.
avatar

FEEX

  • 22 сентября 2023, 13:48
0
На одном форуме подсказали — вроде работает теперь правильно.


Но есть проблема: если нет открытых ордеров, то вместо 0.00000 в строке StopOut price там выводится текушая цена, а этого не должно быть!!! Если нет откр. ордеров, там должно быть 0.00000.
Вот как это сделать — я хз…
P.S. Плохо что к посту нельзя файл прикреплять(((

avatar

FEEX

  • 22 сентября 2023, 13:44
0
это проценты)))
нужна ЦЕНА уровня SO
с каждым новым открытым ордером эта цена изменяется.
а AccountStopoutLevel(); это процент, выданный брокером по конкретному типу счета. Он не меняется)
avatar

FEEX

  • 22 сентября 2023, 13:05
0
я оттуда и брал схему… но там черт ногу сломит…
я попробовал вытащить суть расчета, но походу там значение lots это не сумма всех лотов открытых ордеров, но тогда что??
Кто может написать расчет цены стоп аута с отрисовкой линии этой цены в советнике Андрея, который я выше скинул (в двух постах)?

P.S. Кстати, я проверил — индикатор i-UrovenZero и моя функция показывают ОДИНАКОВОЕ значение цены стоп аута, т.е. логику из индюка я понял правильно…


Но она НЕ точная!!! Слив происходит раньше цены, которую показывает индюк, на 10-15 пунктов (4-х знак). Выше скрин есть, там слив случился 14 пунктов не дойдя до линии слива — которая рисуется по формуле из индюка.
avatar

FEEX

  • 20 сентября 2023, 12:55