0
Ну ребята, включайте сами мозги.
Есть ошибка-переведите текст-устраните причину.
В данном случае: советник нашёл не объявленный параметр -Comm.
Это значит, что в коде есть что-то, что редактор не знает что это такое, не может его ни с чем сопоставить, сравнить.
Не знаете если что это такое — посмотрите структуру функции OrderSend(...) лучше в учебнике или хотя бы в другом советнике, что это за параметр.
В структуре этой функции на этом месте стоит параметр — комментарии ордера.
Этот параметр можно записать как:
— просто не заполненные "",
— заполненные «бла-бла»,
— просто объявленным заранее текстом например:
extern string Comm = «Felice »;// коммент
Выбирайте любой из вариантов.
Уверен, что всё это вы знаете.Просто поторопились расписаться в беспомощности из-за не внимательности.
avatar

ssg

  • 14 июля 2022, 04:20
0
Сначала покажите что и куда «вставляете»…
avatar

ssg

  • 13 июля 2022, 20:59
0
Из zakaz.opentraders.ru/85564.html#comment163827
<code>
//--- Inputs
extern double Lots       = 0.1;      // торговый объем ордера
extern double Risk       = 1;        // риск
.
.
.
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;
   datetime expiration=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(),NormalizeDouble(price,_Digits),Slip,sl,tp,Comm,Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;

   if(Risk>0)
      lot=NormalizeDouble(AccountEquity()*Risk/100000,2);

   return(lot);
  }
//+------------------------------------------------------------------+
</code>
avatar

ssg

  • 13 июля 2022, 19:06
0
Уверен, что есть обоснование для использования именно ТДИ.
Написал индикатор на РСИ.
Но, как говорят, найдите разницу.

//+------------------------------------------------------------------+
//|                  Мультивалютный Информационный индикатор RSI.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

extern string symb1 = "AUDUSD";
extern string symb2 = "EURUSD";
extern string symb3 = "GBPUSD";
extern string symb4 = "NZDUSD";
extern string symb5 = "USDCAD";
extern string symb6 = "USDCHF";
extern string symb7 = "USDJPY";
extern string symb8 = "EURAUD";
extern string symb9 = "EURGBP";
extern string symb10 = "EURNZD";
extern string symb11 = "EURJPY";
extern string symb12 = "XAUUSD";

extern int perrsi = 13;
extern ENUM_TIMEFRAMES tf = PERIOD_CURRENT;
extern int Shift =0; 
extern int corner = 1; 
extern int font = 10; 
int s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12; 
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    ObjectsDeleteAll();
    Comment(""); 
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   s1=iRSI(symb1,tf,perrsi,0,Shift);
   if(symb2!="")s2=iRSI(symb2,tf,perrsi,0,Shift);
   if(symb3!="")s3=iRSI(symb3,tf,perrsi,0,Shift);
   if(symb4!="")s4=iRSI(symb4,tf,perrsi,0,Shift);
   if(symb5!="")s5=iRSI(symb5,tf,perrsi,0,Shift);
   if(symb6!="")s6=iRSI(symb6,tf,perrsi,0,Shift);
   if(symb7!="")s7=iRSI(symb7,tf,perrsi,0,Shift);
   if(symb8!="")s8=iRSI(symb8,tf,perrsi,0,Shift);
   if(symb9!="")s9=iRSI(symb9,tf,perrsi,0,Shift);
   if(symb10!="")s10=iRSI(symb10,tf,perrsi,0,Shift);
   if(symb11!="")s11=iRSI(symb11,tf,perrsi,0,Shift);
   if(symb12!="")s12=iRSI(symb11,tf,perrsi,0,Shift);


               SetLabel("s1", symb1+" : "+s1, clrLime, 5, 15, corner, font);
if(symb2!="")  SetLabel("s2", symb2+" : "+s2, clrLime, 5, 30, corner, font);
if(symb3!="")  SetLabel("s3", symb3+" : "+s3, clrLime, 5, 45, corner, font);
if(symb4!="")  SetLabel("s4", symb4+" : "+s4, clrLime, 5, 60, corner, font);
if(symb5!="")  SetLabel("s5", symb5+" : "+s5, clrLime, 5, 75, corner, font);
if(symb6!="")  SetLabel("s6", symb6+" : "+s6, clrLime, 5, 90, corner, font);
if(symb7!="")  SetLabel("s7", symb7+" : "+s7, clrLime, 5, 105, corner, font);
if(symb8!="")  SetLabel("s8", symb8+" : "+s8, clrLime, 5, 120, corner, font);
if(symb9!="")  SetLabel("s9", symb9+" : "+s9, clrLime, 5, 135, corner, font);
if(symb10!="")  SetLabel("s10", symb10+" : "+s10, clrLime, 5, 150, corner, font);
if(symb11!="")  SetLabel("s11", symb11+" : "+s11, clrLime, 5, 165, corner, font);
if(symb12!="")  SetLabel("s12", symb12+" : "+s12, clrLime, 5, 180, corner, font);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 12.10.2007                                                     |
//|  Описание : Установка текстовой метки, объект OBJ_LABEL.                   |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    nm - наименование объекта                                               |
//|    tx - текст                                                              |
//|    cl - цвет метки                                                         |
//|    xd - координата X в пикселах                                            |
//|    yd - координата Y в пикселах                                            |
//|    cr - номер угла привязки        (0 - левый верхний,                     |
//|                                     1 - правый верхний,                    |
//|                                     2 - левый нижний,                      |
//|                                     3 - правый нижний )                    |
//|    fs - размер шрифта              (9 - по умолчанию  )                    |
//+----------------------------------------------------------------------------+

void SetLabel(string nm, string tx, color cl, int xd, int yd, int cr=0, int fs=9) {
  if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_LABEL, 0, 0,0);
  ObjectSetText(nm, tx, fs);
  ObjectSet(nm, OBJPROP_COLOR    , cl);
  ObjectSet(nm, OBJPROP_XDISTANCE, xd);
  ObjectSet(nm, OBJPROP_YDISTANCE, yd);
  ObjectSet(nm, OBJPROP_CORNER   , cr);
  ObjectSet(nm, OBJPROP_FONTSIZE , fs);
}
//+----------------------------------------------------------------------------+



Некоторая разница из-за разности использования цен при расчете РСИ.
Её легко исправить.
Причем индикатор на ТДИ в несколько раз тяжелеё и сильно грузит комп.
Можете проверить сами при помощи теста на производительность.
avatar

ssg

  • 12 июля 2022, 06:22
0
Да я же не возражаю.Это ваш заказ.
Просто нанесите на экран графика пары и ТДИ и РСИ. Численно значения будут равны.
Но ещё раз повторю — это ваш заказ.
avatar

ssg

  • 11 июля 2022, 16:55
0
Судя по скрину вы берете данные с буфера ТДИ который выводит данные индикатора РСИ.
Может тогда проще сразу использовать просто индикатор РСИ напрямую?*hi* 
avatar

ssg

  • 11 июля 2022, 16:20
0
Что-бы не отвлекать Андрея.Надеюсь он не против.

//+------------------------------------------------------------------+
//|                                                       Corel2.mq5 |
//|                                              Copyright 2022, AM2 |
//|                                     https://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, AM2"
#property link      "https://www.forexsystems.biz"
#property version   "1.00"

#include <Trade\Trade.mqh>             // Подключаем торговый класс CTrade
CTrade trade;

//--- входные параметры
input double   Lot        = 1;         // Лот

input string   Symb       = "USDCHF";  // 2-й символ

input double   LotSymb        = 1;         // Лот

input int      Loss       = 0;         // Лось в валюте
input int      Profit     = 50;        // Профит в валюте

input double   Sigma      = 333;       // Расхождение пар
input bool     CloseCross = 1;         // Закрытие по пересечению

input int      Slip       = 0;         // Проскальзывание
input ulong    Magic      = 123;       // Магик

input string IndName      = "Coral";
input int bar             = 55;

int ind=0;
double s1[2],s2[2];
datetime t=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ind=iCustom(NULL,0,IndName,Symb,bar);
   trade.SetExpertMagicNumber(Magic);

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//|  Position Profit                                                 |
//+------------------------------------------------------------------+
double AllProfit()
  {
   double p=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            p+=PositionGetDouble(POSITION_PROFIT);
           }
        }
     }
   return(p);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll()
  {
   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
              {
               trade.PositionClose(PositionGetTicket(i));
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;

   for(int i=PositionsTotal()-1; i>=0; i--)
     {
      if(PositionSelectByTicket(PositionGetTicket(i)))
        {
         if(PositionGetInteger(POSITION_MAGIC)==Magic)
           {
            if(PositionGetInteger(POSITION_TYPE)<2)
               count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   double Ask1=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double Bid1=SymbolInfoDouble(_Symbol,SYMBOL_BID);

   double Ask2=SymbolInfoDouble(Symb,SYMBOL_ASK);
   double Bid2=SymbolInfoDouble(Symb,SYMBOL_BID);

   double sigma=MathAbs(s1[0]-s2[0])/_Point;

   CopyBuffer(ind,0,0,2,s1);
   CopyBuffer(ind,1,0,2,s2);

   if(t!=iTime(NULL,0,0))
     {
      if(CountTrades()<1 && sigma>Sigma)
        {
         if(s1[0]<s2[0])
           {
            trade.Buy(Lot,_Symbol,Ask1,0,0,"");
            trade.Sell(LotSymb,Symb,Bid2,0,0,"");
           }

         if(s1[0]>s2[0])
           {
            trade.Sell(Lot,_Symbol,Bid1,0,0,"");
            trade.Buy(LotSymb,Symb,Ask2,0,0,"");
           }
        }

      if((AllProfit()>Profit && Profit>0) || (AllProfit()<-Loss && Loss>0) || (s1[0]>s2[0] && s1[1]<s2[1]&& CloseCross) || (s1[0]<s2[0] && s1[1]>s2[1] && CloseCross))
         CloseAll();

      t=iTime(NULL,0,0);
     }

   Comment("\n Trades: ",CountTrades(),
           "\n Profit: ",AllProfit(),
           "\n Sigma: ",sigma,
           "\n Symbol1: ",s1[0],
           "\n Symbol2: ",s2[0]);
  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

avatar

ssg

  • 11 июля 2022, 10:48
0
Андрей, спасибо за работу и оперативность.
Ни как не мог понять почему такой большой лот.По моим расчетам новый лот не мог быть более чем в 2 раза больше чем стартовый. А вообще в пределах 1.1-2.
Причем в 2 раза больше при условии, что убыток и профит равны.
Пока не посмотрел повнимательнее расчет лотов. Там оказалась небольшое, но существенное отличие от ТЗ.
Переписал функцию, добавив ещё и проверку деления на 0:


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot()
  {
   double lot=Lots;
   for(int i=OrdersHistoryTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderProfit()>0)
           {
            lot=Lots;
            break;
           }
         if(OrderProfit()<0)
           {
            if(LastLoss()!=0 && LastProfit()!=0)
              {
              if(LastLoss()>=LastProfit())lot=Lots*(LastLoss()+LastProfit())/LastLoss();
              if(LastLoss()<LastProfit())lot=Lots*(LastLoss()+LastProfit())/LastProfit();  
              if(lot>=1)lot=Lots;
              }
            break;
           }
        }
     }
   return(NormalizeDouble(lot,2));
  }
//+------------------------------------------------------------------+

Но конечно в лоб эта идея не работает.
Проверю наверное с добавлением стационарных или стоплосса или тейпрофита раздельно.
Сигнал на открытие позиции опираясь на Ма конечно был формальный.
avatar

ssg

  • 10 июля 2022, 13:50
0
<code>

extern double Lots        = 0.01;     // торговый объем ордера
extern ENUM_TIMEFRAMES tf = PERIOD_CURRENT;
extern int MA1Period      = 50;       // период МА1
extern int Shift          = 1;        // на каком баре сигнал индикатора
//+------------------------------------------------------------------+
.
.
.
.
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    
    double ma1=iMA(NULL,tf,MA1Period,0,0,0,Shift);
    double cl1 = iClose(NULL,tf,1);
    double cl2 = iClose(NULL,tf,2);
    
    bool buy=cl1>ma1 && cl2>ma1;
    
    bool sell=cl1<ma1 && cl2<ma1;
    
    bool clbuy=cl1<ma2 && cl2>ma1;
    
    bool clsell=cl1>ma2 && cl2<ma1;
    
   if(clbuy)CloseAll(0);
   
   if(clsell)CloseAll(1);
   
   если предыдущая сделка была убыточная
   double lot = Lots*((последний убыток+последний профит)/последний убыток);//не важно или в валюте или в пунктах.
   
   if(CountTrades()<1)
     {
      if(buy)
        {
         PutOrder(0,Ask,lot);
        } 
                       
      if(sell)
        {
         PutOrder(1,Bid,lot);
        }
     }

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

</code>

примерно так.
Не фиксированный тейк и стоплосс, а те конкретные числа которые будут получатся в ходе торговли.И убыток и профит всегда будут разными.
Соотвественно и коэф-нт, на который нужно будет умножить лот, каждый раз будет разный.
avatar

ssg

  • 10 июля 2022, 09:54
0
И еще, по секрету:
стратегия это торговля от уровней атр, Hi — atr = зона нижняя, lo + atr = верхняя зона


Hi — atr = зона нижняя = lo
а
lo + atr = верхняя зона = Hi

avatar

ssg

  • 10 июля 2022, 04:36
0
У нас с вами разное восприятие ситуации.Спорить с вами я не собираюсь, и не хочу, и не вижу темы спора, да и лень.Считайте, что я не верно выразился, если конечно так удобнее.Ещё раз повторяю: выше я для вас написал и дал код индикатора. Он полностью подходит по ваши задачи.Подумайте как вам его лучше использовать.Немного доработайте и он будет рисовать линии.Возьмите с него данные и в крайнем случае вручную нанесите зоны.Один раз в месяц это не трудно.
Или пусть советник их рисует.
К стати о восприятии: не знаю как до Урала, но у нас за Уралом в быту, однозначно, значение жаргонизма «дальняк» определяется как «отхожее место», «туалет», «сортир».
Видите сами какие мы разные.
Я использую в разговоре термины — долгосрочная торговля, долгосрочный прогноз.
Ну это так лирика.
Удачи.
avatar

ssg

  • 10 июля 2022, 04:33
0
Нет, я так и не понимаю что вам нужно.
Я написал вам индикатор, который показывает в виде баров в подокне графика АТР за любое кол-во баров на любом таймфрейме.
Вы всегда можете взять эти данные для работы или для советника.Вам этого для торговли не хватает.
Сейчас какая то новая «узкая» задач. Мне не интересно и не нужно решать кому-то такие вещи.
Всю стратегию вы не озвучиваете ни здесь ни в привате. Наверное очень ей дорожите и поэтому храните в секрете. И это ваше законное право.
Но это вы обратились сюда за помощью.
А отвлекаться на написание каких то кусочков я не хочу и не буду.
Если хотите что-бы я попытался вам помощь озвучьте всю задачу (или здесь или в привате).
Ну, а нет, тогда я искренне желаю вам успехов и удачи.
avatar

ssg

  • 9 июля 2022, 11:21
0
Тут я с вами согласен. Если меняя настройки не меняется значения индикатора, то это неверно.
Может быть есть смысл сделать два скрина с настройками и показать Андрею?
avatar

ssg

  • 8 июля 2022, 16:47
0
Каждый выбирает сам и способ торговли, и стратегию, и риски… И имеет на это полное право.
Но неужели вам нужно знать квартальный АТР для торговли на самом деле?
Вы собираетесь открыть позицию, терпеть убытки и ждать пока цена не пройдет все значение АТР за квартал?
Я понимаю это работает на бирже, с акциями.Там нет такой волотильности и возможен более менее долгосрочный прогноз.Типа:«Зимой мазут и газ подорожают».
Но на форексе…
На мой взгляд намного продуктивнее и прибыльнее торговать используя текущую тенденцию на рынке.Только представьте какие колебания цены внутри месяца или квартала.Да даже дня.А вы открыли позицию, ждали целый квартал, глядели как у вас растет и падает прибыль и в итоге закрылись с убытком.
Но выбор конечно за вами.Деньги же ваши.
avatar

ssg

  • 8 июля 2022, 08:43
0
Кроме прочего нужно проверить параметры и настройки обоих вариантов, а главное у МТ4 и МТ5 не одинаковые архивы котировок. Незначительные, вроде, различия во времени и при вычислениях приводят к погрешностям.
И опять же: вам стрелочки или торговать?
Проверяйте численное значение индикатора, а не визуальное.Машина апеллирует числами.
avatar

ssg

  • 8 июля 2022, 06:45
0
Вы серьёзно.....? Тем более при нынешней ситуации?:D 
avatar

ssg

  • 8 июля 2022, 06:27
0
Если бы вы огласили конечную цель использования, то возможно можно было бы найти иное решение. А так....*hi* 
avatar

ssg

  • 7 июля 2022, 17:38
0
Я вот тоже не могу никак понять эту математическую казуистику.
В крайнем случае напишите индикатор где через iCustom или просто через iATR берите данные на месячном периоде и их обрабатывайте.
Вот набросал вам вариант получения нужных вам данных:
<code>
//+------------------------------------------------------------------+
//|                            MTF_Average True Range  lafler356.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                          http://www.mункцql5.com |
//+------------------------------------------------------------------+

/*
  полный вызов индикатора нулевого (единственного) буфера на нулевом баре:
  double ind_ATR = iCustom(NULL,PERIOD_MN1,"MTF_Average True Range  lafler356",TimeFrame,per,MAType,0,0);
*/
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mункцql5.com"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 clrLime

extern ENUM_TIMEFRAMES TimeFrame= PERIOD_MN1;
extern int per=10;
extern int MAType=0;

double ExtMapBuffer1[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexStyle(0,DRAW_HISTOGRAM, 0, 1);
   SetIndexBuffer(0, ExtMapBuffer1);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
    datetime TimeArray[];
   int    i,limit,y=0,counted_bars=IndicatorCounted();
   double PeriodHigh, PeriodLow;

   ArrayCopySeries(TimeArray,MODE_TIME,NULL,TimeFrame); 
   
   limit=Bars-counted_bars;
   for(i=0,i<limit;i++)
   {
      PeriodHigh = iMA(NULL,TimeFrame,per,0,MAType,PRICE_HIGH,i);
      PeriodLow = iMA(NULL,TimeFrame,per,0,MAType,PRICE_LOW,i);
      ExtMapBuffer1[i]= (PeriodHigh - PeriodLow)/_Point;
   } 
   return(rates_total);
  }
//+------------------------------------------------------------------+

</code>

<code>
значение атр текущего месяца:
double ind_ATR = iCustom(NULL,PERIOD_MN1,"MTF_Average True Range  lafler356",TimeFrame,1,MAType,0,0);
значение атр текущего квартала:
double ind_ATR = iCustom(NULL,PERIOD_MN1,"MTF_Average True Range  lafler356",TimeFrame,3,MAType,0,0);

</code>

Если опять что-то не так, или не сможете использовать, тогда я «умываю руки».

avatar

ssg

  • 7 июля 2022, 17:15