Обучение языку MQL4 под MetaTrader 4📌

От xbms, 13 апреля, 2013 в Уголок Программиста

#5751

 

12 часов назад, MikR0ReR сказал:

@VAS35 почему решили что проблема на 3 свече. У вас Выдает ошибку?? так дайте скрин! Я например проверил ошибок нет. И я так понимаю вы дали не весь код, урезанный?? мне нужно конкретика.

Код был без отправки на мэйл. Вот полный код. И скрин.

Спойлер

//+------------------------------------------------------------------+
//|                                                       Figaro.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2     
#property indicator_color1 Blue   
#property indicator_color2 Red    
double Buy[];                   
double Sell[];                  
#define BUY 0
#define SELL 1
input bool EMail = false;
double         buy[];
double         sell[];
bool           AlertsON;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
AlertsON=(EMail && (!IsTesting() || IsVisualMode()) );
SetIndexBuffer (0, Buy);
SetIndexBuffer (1, Sell);  

SetIndexEmptyValue (0, 0);
SetIndexEmptyValue (1, 0);

SetIndexStyle (0, DRAW_ARROW);
SetIndexStyle (1, DRAW_ARROW); 
SetIndexArrow(0, 233);  // Стрелка "вверх" для покупок
SetIndexArrow(1, 234);  // Стрелка "вниз" для продаж

IndicatorDigits (Digits);

IndicatorShortName ("FIGARO");

SetIndexLabel(0, "Покупаем");
SetIndexLabel(1, "Продаём");

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[])
{

int counted_bars = IndicatorCounted();
int limit, signal;

if (counted_bars>0) 
counted_bars-- ;

limit=Bars-counted_bars;

for(int i = 2; i < limit; i++) 
{
signal = Signal(i-1);
if (signal == BUY)
{ 
Buy[i-1] = low[i-1];
}
else
if (signal == SELL)
{
Sell[i-1] = high[i-1];
}
}
 AlertsFun(buy,sell,time[0],1);
return(rates_total); } 
//+------------------------------------------------------------------+
void AlertsFun(double & aBuy[],double & aSell[],datetime aTime0,int aIndex)
   {
   if(AlertsON)
     {
       string mes="";
       static datetime blt=0;
       static datetime slt=0;   
          
       if(blt==0)
        {
          blt=aTime0;
          slt=aTime0;
        }
      if(blt!=aTime0)
       {   
         if(aBuy[aIndex]!=0 && aBuy[aIndex]!=EMPTY_VALUE)
           {
             blt=aTime0;
             mes=WindowExpertName()+"("+Symbol()+","+(string)(PeriodSeconds()/60)+"): buy";
            
            if(EMail)
             {
               SendMail(mes,mes);
             }
             
            if(IsTesting())
             {
               Comment(TimeToStr(aTime0)+" :: "+mes);
             }
           }   
      }
      if(slt!=aTime0)
       {   
         if(aSell[aIndex]!=0 && aSell[aIndex]!=EMPTY_VALUE)
            {
              slt=aTime0;
              mes=WindowExpertName()+"("+Symbol()+","+(string)(PeriodSeconds()/60)+"): sell";
           
            if(EMail)
              {
                SendMail(mes,mes);
              } 
               
            if(IsTesting())
              {
                Comment(TimeToStr(aTime0)+" :: "+mes);
              }                     
            } 
       }
   }
}
int Signal(int i)
{
     double O_1 = iOpen(Symbol(), 0, 1);
     double O_2 = iOpen(Symbol(), 0, 2);
     double O_3 = iOpen(Symbol(), 0, 3);
     double O_4 = iOpen(Symbol(), 0, 4);
     double C_1 = iClose(Symbol(), 0, 1);
     double C_2 = iClose(Symbol(), 0, 2);
     double C_3 = iClose(Symbol(), 0, 3);
     double C_4 = iClose(Symbol(), 0, 4);
     double H_1 = iHigh(Symbol(), 0, 1);
     double H_2 = iHigh(Symbol(), 0, 2);
     double L_1 = iLow(Symbol(), 0, 1);
     double L_2 = iLow(Symbol(), 0, 2);
     double S_1 = iVolume(Symbol(), 0, 1);
     double S_2 = iVolume(Symbol(), 0, 2);
     double S_3 = iVolume(Symbol(), 0, 3);
     
if ((O_1<C_1 && S_1>=8 && S_2==0 && O_3>C_3 && O_4>C_4 && (H_2-O_2)>=6 && (C_2-L_2)>=6) || (O_1<C_1 && S_1>=10 && O_2>C_2 && S_2>=8 && O_3>C_3 &&
O_4>C_4 && S_3>=8 && O_1<=C_2 && O_1<C_3 && O_2<C_1 && O_3<C_1) || (O_1<C_1 && O_2>C_2 && O_3>C_3 && O_4>C_4 && S_1<=1 && (O_1-L_1)>=5 && (H_1-C_1)<=2) || (O_1<C_1 && S_1>=10 &&
O_2>C_2 && O_3>C_3 && S_2>=10 && S_1>=S_2*0.6 && O_1<C_2 && (H_1-C_1)<=2 && (O_1-L_1)<=2 && (H_2-O_2)<=2 && (C_2-L_2)<=2) || (O_1<C_1 && S_1>=10 && O_2>C_2 &&
S_2>=8 && C_1<=C_2 && (H_1-C_1)<=2 && (O_1-L_1)<=2 && (H_2-O_2)<=2 && (C_2-L_2)<=2))

  
     return (BUY);
     
if ((O_1>C_1 && S_1>=8 && S_2==0 && O_3<C_3 && O_4<C_4 && (H_2-O_2)>=6 && (C_2-L_2)>=6) || (O_1>C_1 && S_1>=10 && O_2<C_2 && O_3<C_3 && O_4<C_4 &&
S_2>=8 && S_3>=8 && O_1>=C_2 && O_1>C_3 && O_2>C_1 && O_3>C_1) || (O_1>C_1 && O_2<C_2 && O_3<C_3 && O_4<C_4 && S_1<=1 && (C_1-L_1)>=5 && (H_1-O_1)<=2) || (O_1>C_1 && S_1>=10 && 
O_2<C_2 && O_3<C_3 && O_4<C_4 && S_2>=10 && S_1>=S_2*0.6 && O_1>C_2 && (H_1-O_1)<=2 && (C_1-L_1)<=2 && (H_2-C_2)<=2 && (O_2-L_2)<=2) || (O_1>C_1 && S_1>=10 && O_2<C_2 &&
O_3<C_3 && O_4<C_4 && S_2>=8 && C_1>=C_2 && (H_1-O_1)<=2 && (C_1-L_1)<=2 && (H_2-C_2)<=2 && (O_2-L_2)<=2))
    
     
     return (SELL);
     
     return(-1);
     
}

 

Спойлер

Фигаро.PNG

 

На скрине видно, что 3 свеча небольшая. Хотя в коде пытался прописать, чтобы размер был от 8.

Отправку на почту ещё до ума не довел. Не проверил.

Изменено 1 октября, 2019 пользователем 0ll

#5752

@VAS35 Прошу не спамь! Пользуйся кнопочкой изменить, если хочешь что то дописать.

Я хочу помочь! Но на скрине вижу много свечей и стрелку. И как мне понять что ты считаешь 1-ой свечой и что 3-ей?

Потом я обратил внимание что у меня индикатор не работает, не рисует стрелки.

#5753
5 минут назад, MikR0ReR сказал:

@VAS35 Прошу не спамь! Пользуйся кнопочкой изменить, если хочешь что то дописать.

Я хочу помочь! Но на скрине вижу много свечей и стрелку. И как мне понять что ты считаешь 1-ой свечой и что 3-ей?

Потом я обратил внимание что у меня индикатор не работает, не рисует стрелки.

Прошу прощения. Я только что гонял его в тестере и сделал скрин. Первой считаю ту, на которой стрелка.

#5754

899045991_.PNG.67517837f602d342b157366c92baa880.png.098b520e7babbdd5723a8fd05e86876c.png

  • И что должно произойти по твоему с 3-й свечей? Стрелка в низ? 
  • я протестил, у меня все стрелки рисуются, вверх и вниз.
  • так, еще могут не отсеиваться бары по причине значности брокера. Я говорю о том что может ты упустил что 8 пунктов 4-х значного брокера есть 80 пунктов 5-и значного брокера. Не, не то?
#5755

Разве свечи считаются не справа - налево?  Первая свеча со стрелкой, вторая - предыдущая, и так далее. Да и вначале кода прописано Digits...

#5756
  • @VAS35 понял про какую свечу ты говоришь. Так теперь что на ней должно быть стрелка в низ?
  • если ты об этом IndicatorDigits(Digits); то это влияет на окно "Окно Данных" в МТ4 с какой точностью там будут отображаться данные. На код и вычисления не влияет.
  • походу придется разбираться с твоим кодом, вникать в идею, что бы понять тебя.
#5757

Не. Смотри. Свечи здесь вообще быть не должно.  Здесь должна была отработать модель поглощения.  Типа бычья свеча поглотила 2 медвежьи, причем объём 2-ой больше 8 и объём третьей тоже больше 8, и обе они медвежьи. А по факту получается, что 2 и 3 свечи медвежьи, но, объём второй больше 8, а третьей - меньше. А насчет знаков после запятой, как прописать тогда?

#5758

@VAS35 попробуй

1.mq412 скач.

#5759
6 часов назад, MikR0ReR сказал:

Интересно получилось. Только он стал размещать стрелку с запозданием в 1 бар. А объём третьей свечи, к сожалению, не считает. Я тоже грешил на количество свечей. Вывел лимит в принт, чтобы посмотреть, сколько он считает свечей. И пробовал колдовать с ним. Но он стал рисовать разное количество стрелок. Блин, я года три назад писал советник с таким же принципом, только еще с МА, RSI и MACD. Там таких проблем не было. Получилось очень достойно. На старом компе накрылся южный мост. Надо как-то выцарапать данные с диска. Как достану, выложу сюда. Просто были иногда ложные сигналы. А мне всё надо было полную безубыточность.

#5760
  • @VAS35 Так мне дальше смотреть ошибки в коде, по этой 3 свече?
  • Я тут посмотрел, ты говоришь о объеме, если речь идет о long S_3 = iVolume(NULL, 0, q+3); то тут ты не прав. Все считает, минимальный объем около 100, а у тебя стоит 8. Давай подумай 100 > 8, я думаю да. Ну так такое условие стоит и у тебя, вот оно и исполняется.

Изменено 1 октября, 2019 пользователем MikR0ReR

#5761
36 минут назад, MikR0ReR сказал:

@VAS35 Так мне дальше смотреть ошибки в коде, по этой 3 свече?

Если не сложно, давай попробуем разобраться. 

#5762
18 минут назад, lexinson сказал:

Уважаемые программисты, подскажите, почему при появлении стрелочки не появляется алерт? Индикатор не мой, хотел доработать под себя. Заранее благодарю

 

3-MA-Cross-Alert.mq4 9 \u043a\u0411 · 2 загрузки

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

1399332651_618798809.jpg

Изменено 2 октября, 2019 пользователем bataka

#5763

В блоке int OnCalculate есть "const long &volume[]" и "const int &spread[]". Они в mq4 работают и что в них хранится. Ну по поводу spread я догадываюсь что там должно. Я запамятовал.

#5764

Подскажите что за ошибка                        'iCustom' - wrong parameters count    Индикатор.mq4    58    36

#5765

@Partorius iCustom строку полностью напиши

#5766
14 минут назад, MikR0ReR сказал:

@Partorius iCustom строку полностью напиши

Спойлер

double buy              = iCustom (Symbol(), 0, "Индикатор уровней", 1000, "---Таймфреймы---", False, True, True, True, True, True, False, "---Уровни Мюррея---", True, True, True, False, True, False, False, False, True, False, True, True, True, False, "---Зоны стохастика---", 70, 30, "---фильтр форекс (паттерны)---", True, True, True, True, True, True, "---фильтр бинарных опционов---", False, False, False, "---Стили---", Blue, Orange, 10, 1, 15, While, While, "---Сигналы---", True, False, False, "---Тренд---", True, 20, 20, False, True, True, True, True, True, True, False, False, Chartreuse, Red, 1, 1);

 

#5767

@Partorius Много входных данных! Не влезаю в ограниченную область 6 последних параметров.

#5768
47 минут назад, MikR0ReR сказал:

@Partorius Много входных данных! Не влезаю в ограниченную область 6 последних параметров.

И что с этим делать?

#5769

@Partorius

  1. если есть доступ к исходнику индикатора
//сейчас так
"---Тренд---", True, 20, 20, False, True, True, True, True, True, True, False, False, Chartreuse, Red, 1, 1);

//мы знаем что не влезают последние 6 параметров как от нас хочет iCustom и по его мнению должно быть вот так
"---Тренд---", True, 20, 20, False, True, True, True, True, 1, 1);

//в исходнике в блоке "---Тренд---" меняем местами переменные, Chartreuse, Red поднимаем выше.
//Примерно получится так если передовать все параметры на iCustom. Опять же всю строку iCustom приводить не буду, только последний кусок.
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, True, True, False, False, True, True, 1, 1);

//и опять мы знаем что не влезают последние 6 параметров. обрезаем и должно получится так
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, 1, 1);

те параметры которые мы не указали, что не влезли, "True, True, False, False, True, True" возьмутся из исходника, но к ним, как мы знаем не будет доступа для изменения.

 

  1. если у нас нет доступа к исходнику индикатора
#5770
22 минуты назад, MikR0ReR сказал:

@Partorius

  1. если есть доступ к исходнику индикатора

//сейчас так
"---Тренд---", True, 20, 20, False, True, True, True, True, True, True, False, False, Chartreuse, Red, 1, 1);

//мы знаем что не влезают последние 6 параметров как от нас хочет iCustom и по его мнению должно быть вот так
"---Тренд---", True, 20, 20, False, True, True, True, True, 1, 1);

//в исходнике в блоке "---Тренд---" меняем местами переменные, Chartreuse, Red поднимаем выше.
//Примерно получится так если передовать все параметры на iCustom. Опять же всю строку iCustom приводить не буду, только последний кусок.
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, True, True, False, False, True, True, 1, 1);

//и опять мы знаем что не влезают последние 6 параметров. обрезаем и должно получится так
"---Тренд---", True, 20, 20, False, True, True, Chartreuse, Red, 1, 1);

те параметры которые мы не указали, что не влезли, "True, True, False, False, True, True" возьмутся из исходника, но к ним, как мы знаем не будет доступа для изменения.

 

  1. если у нас нет доступа к исходнику индикатора

Естественно исходника нет, попробую второй вариант

#5771

@Partorius добавлю, iCustom может принять до 64 параметров (не проверял), у Вас 65, так что можно попробовать влезть...

#5772

@0ll проверено методом тыка, не влезают 6 параметров, итог 49 параметров влезает вiCustom (проверено)

 

Да верно 59, опечатка.

Изменено 8 октября, 2019 пользователем MikR0ReR

#5773
28 минут назад, MikR0ReR сказал:

не влезают 6 параметров, итог 49 параметров влезает вiCustom (проверено)

отлично! но я насчитал 65 и -6 = 59?

#5774

Всем привет! Имеются 2 функции, в которых содержатся массивы ордеров, а точнее их профиты. Первый будет массив который собрал профиты в реальном времени, а второй взял профиты ордеров с истории. Идея такова, т.к. торговля происходит в двух направлениях, то при возникновении ситуации с просадкой какой-то сетки, мы закрываем убыточные ордера неубыточными, взятыми с истории. Ну так вот коды 2-х функций которые создают массивы: 

 
Спойлер

//+---------------------Профит уже закрытых ордеров на продажу----------------------+
void OrderProfitSellClose(double &cSellProfitClose[])
  {
   int counter=0,size=OrdersHistoryTotal();
   ArrayResize(cSellProfitClose,size);
   for(int i=0; i<OrdersHistoryTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
        {
         if(OrderType()==OP_SELL)
           {
            cSellProfitClose[i-1]=OrderProfit();
            counter++;
           }
        }
     }
   ArrayResize(cSellProfitClose,counter);
   return;
  }

//+---------------------Профит еще не закрытых ордеров на покупку----------------------+
void OrderProfitBuy(double &cBuyProfitOpen[])
  {
   int counter=0,size=OrdersTotal();
   ArrayResize(cBuyProfitOpen,size);
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderType()==OP_BUY)
           {
            cBuyProfitOpen[i-1]=OrderProfit()+OrderCommission()+OrderSwap();
            counter++;
           }
        }
     }
   ArrayResize(cBuyProfitOpen,counter);
   return;
  }

 

Теперь что я делаю, я хочу закрыть к примеру покупки, т.е. сетку которая находится в просадке по buy:

 
Спойлер

                  //закрытие покупок
                  OrderProfitSellClose(cSellProfitClose);// Профит уже закрытых ордеров на продажу

                  double SellProfitClose = 0.0; // создаю переменную в которую будет сливаться весь перечисленный профит ордеров

                  for(int b=0; b < ArraySize(cSellProfitClose); b++) //перебираю массив
                    {
                     cSellProfitClose=+SellProfitClose; // суммирую профит закрытых ордеров по продажам, которые взяты с истории по функции
                    }

                  OrderProfitBuy(cBuyProfitOpen);        // Профит еще не закрытых ордеров на покупку

                  double BuyProfitOpen = 0.0; // так же создаю переменную куда будет скапливаться вся сумма по профиту на buy, те самые просадочные ордера в минусе

                  for(int t=0; t < ArraySize(cBuyProfitOpen); t++) // перебираю массив на buy 
                    {
                     cBuyProfitOpen[t]=+BuyProfitOpen; // суммирую все минусовые просадки по профиту
                     if(MathAbs(BuyProfitOpen) <= SellProfitClose) // здесь сравниваю две переменные с их суммами, уравнивая знак ''-'' на ''+''
                       {
                        if(OrderType() == OP_BUY)
                           bool close_profit_buy = OrderClose(OrderTicket(), OrderLots(), Bid, Slippage); // здесь закрываю ордера ровно или приблезительно на тот профит который стоит по условию закрытия
                       }
                    }
                 }

 

И, не работает))) Что сделал не так? Прошу помогите.

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

Изменено 8 октября, 2019 пользователем diodio

#5775

@0ll Да верно 59. Опечатка.

Для публикации сообщений создайте учётную запись или авторизуйтесь

Перейти к списку тем
Форум · 2.0.20260627.0025