0
Оптимизирован, но не расчитан для функции iCostom…
avatar

Kudryashov

  • 27 февраля 2020, 22:45
0
Но в стрелочных индикаторах есть условия по которым выставляются. Если вы знаете какое условия для выставления той или иной стрелки вы можете без всякого индикатора воплотить это условие в советнике.
avatar

Kudryashov

  • 27 февраля 2020, 22:42
0
Пример не нащел(  так что придется словами…
Если у вас есть индикатор оптимизированый… Вы можете его вогнать в советник через функцию iCustom… Она берет данные из буферов вашего индикатора и передает их советнику для анализа… Однако, это хорошо подходит для индикаторов которые строят графики, а для стрелочного индикаторов она… Скажем так: не очень подходит.
avatar

Kudryashov

  • 27 февраля 2020, 22:37
0
По буферам пишутся только советники по индикаторам.
avatar

Kudryashov

  • 27 февраля 2020, 22:27
0
Надеюсь вы знаете как создать шаблон советника и как там заменять алгоритм!?*wizard* 
avatar

Kudryashov

  • 27 февраля 2020, 16:58
0
у меня нет данных будущего года…
avatar

Kudryashov

  • 27 февраля 2020, 14:33
0
*think* 
не то что это будет объединение… и стрелки я хз… но в таком случае он будет всего 2 сделки за 2019 год открывать.:D 
avatar

Kudryashov

  • 27 февраля 2020, 13:52
0
*???* 
с функцией PlaySound я еще не работал…
*think* 
avatar

Kudryashov

  • 27 февраля 2020, 11:29
0
а вот на счет советника… через функцию iCustom…
в данном индикаторе она не может рассчитать на текущем баре, а на следующем баре условие уже меняется и советник их не замечает.
Так что в данной ситуации правильнее было написать советник и вставить в него условия которые в индикаторе, НО… :D 
avatar

Kudryashov

  • 27 февраля 2020, 11:25
+1
Лучше бы еще 1 создали и вместе сравнили… может один раньше другой позже *uptrend* 
Я думал что там есть что переписать… но оказалось кроме замене главной вункции start на OnCalculate. start — это функция в основном в скриптах. OnCalculate — функция в индикаторных. В общем согласно инструкции. Также объединил 2 цикла в 1. Ибо считает 2 раза одно и тоже… нелогичненько.
Вот ваш оригинальный… для удобства в сообщении он будет помечен как OLD

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int ADXbars = 14;
extern int CountBars = 350;
extern string SoundFile="Alert.wav";
extern bool UseSound=true;
bool SoundBuy = False;
bool SoundSell = False;
double gda_84[];
double gda_88[];
double gd_92;
double gd_100;
double gd_108;
double gd_116;

int init()
{
//string ls_0;
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 108);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 108);
SetIndexBuffer(0, gda_84);
SetIndexBuffer(1, gda_88);
return (0);
}

int start()
{
if (CountBars >= Bars) CountBars = Bars;
SetIndexDrawBegin(0, Bars - CountBars);
SetIndexDrawBegin(1, Bars - CountBars);
int li_8 = IndicatorCounted();
if (li_8 < 0) return (-1);
if (li_8 < 1)
   
{
   
for (int li_0 = 1; li_0 <= CountBars; li_0++) gda_84[CountBars - li_0] = 0.0;
   
for (li_0 = 1; li_0 <= CountBars; li_0++) gda_88[CountBars - li_0] = 0.0;
   
}
for (int li_4 = CountBars; li_4 >= 0; li_4--)
   
{
   gd_92
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_PLUSDI, li_4 - 1);
   gd_100
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_PLUSDI, li_4);
   gd_108
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_MINUSDI, li_4 - 1);
   gd_116
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_MINUSDI, li_4);
   
if (gd_92 > gd_108 && gd_100 < gd_116) gda_84[li_4] = Low[li_4] - 5.0 * Point;
   
if (gd_92 < gd_108 && gd_100 > gd_116) gda_88[li_4] = High[li_4] + 5.0 * Point;
   
}
//+------------------------------------------------------------------+
if (gda_84[1] != EMPTY_VALUE && gda_84[1] != 0 && SoundBuy)
   
{
   
SoundBuy = False;
   
if (UseSound) PlaySound (SoundFile);
   
Alert("OLD-SixtySecondTrades(", Symbol(), ", ", Period(), ") — BUY!!!");
   
}
if (!SoundBuy && (gda_84[1] == EMPTY_VALUE || gda_84[1] == 0)) SoundBuy = True;
if (gda_88[1] != EMPTY_VALUE && gda_88[1] != 0 && SoundSell)
   
{
   
SoundSell = False;
   
if (UseSound) PlaySound (SoundFile);
   
Alert("OLD-SixtySecondTrades (", Symbol(), ", ", Period(), ") — SELL!!!");
   
}
if (!SoundSell && (gda_88[1] == EMPTY_VALUE || gda_88[1] == 0)) SoundSell = True;
//+------------------------------------------------------------------+
return (0);
}

avatar

Kudryashov

  • 27 февраля 2020, 11:18
0
Я уже писал… СОВЕТНИК НЕ МОЖЕТ РАБОТАТЬ ПО АЛЕРТАМ!!! У этой функции нет возвращаемого значения… поэтому нет возможности проверить сработал алерт или нет.*wall* 
avatar

Kudryashov

  • 27 февраля 2020, 09:29
+1
Попробовал, оказалось не так то он и требовал переписки. Однако мне как любителя свежачка приятненько :3, а вам как знатока этого индикатора прошу сравнить с вашей версией у меня Mt4 билд 1262.

//+------------------------------------------------------------------+
//|                                            SixtySecondTrades.mq4 |
//|                              Copyright 2020, Dmitriy Kudryashov. |
//|                       https://www.mql5.com/ru/users/dlim0n4ik.dk |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, Dmitriy Kudryashov."
#property link      "https://www.mql5.com/ru/users/dlim0n4ik.dk"
#property version   "200.226"
#property strict

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red


//+------------------------------------------------------------------+
//|   Блок вводимых параметров                                       |
//+------------------------------------------------------------------+
extern int ADXbars = 14;            //Период ADX
extern int CountBars = 350;         //Количество баров для отрисовки
extern string SoundFile="Alert.wav";//Файл звука оповещений (Alerts)
extern bool UseSound=true;          //Использовыать звуковое оповещения
bool SoundBuy = false;
bool SoundSell = false;
double up_buffer[];
double down_buffer[];
double adx_plusdi_1;
double adx_plusdi_0;
double adx_minusdi_1;
double adx_minusdi_0;
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Функция инициализации программы                                |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 108);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 108);
SetIndexBuffer(0, up_buffer);
SetIndexBuffer(1, down_buffer);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|   Функция деинициализации программы                              |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--------------------------------------------------------------------
//ObjectDelete("info_copyright");
//--------------------------------------------------------------------
}
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,       // Размер входных таймсерий
               
const int prev_calculated,   // Обработано баров на предыдущем вызове
               
const datetime &time[],      // Time
               
const double &open[],        // Open
               
const double &high[],        // High
               
const double &low[],         // Low
               
const double &close[],       // Close
               
const long &tick_volume[],   // Tick volume
               
const long &volume[],        // Real volume
               
const int &spread[]          // Spread
               
)
{
//
//string com;
//com += rates_total + "\n";
//com += prev_calculated + "\n";
//com += Bars + "\n";
//com += IndicatorCounted() + "\n";
//Comment(com);
//--------------------------------------------------------------------
//if(Bars <= 100)     // Проверим количества баров для расчётов
//   {
//   Print("There are not enough bars in history to calculate.");
//   return (rates_total);    
//   }
//--------------------------------------------------------------------
if (CountBars >= Bars) CountBars = Bars;
SetIndexDrawBegin(0, Bars - CountBars);
SetIndexDrawBegin(1, Bars - CountBars);
//--------------------------------------------------------------------
int ExtCountedBars = IndicatorCounted();  // Получим количества уже посчитанных баров
if(ExtCountedBars < 0) return (-1);       // Проверим на возможные ошибки в подсчетах
//--------------------------------------------------------------------
if (ExtCountedBars < 1)
   
{
   
for (int clear_bars = 1; clear_bars <= CountBars; clear_bars++)
     
{
      up_buffer
[CountBars - clear_bars] = 0.0;
      down_buffer
[CountBars - clear_bars] = 0.0;
     
}
   
//for (int clear_bars = 1; clear_bars <= CountBars; clear_bars++) down_buffer[CountBars - clear_bars] = 0.0;
   
}
//--------------------------------------------------------------------
for (int index = CountBars; index >= 0; index--)
   
{
   
//--- Расчет индикатора ADX на текущем баре
   adx_plusdi_0
= iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_PLUSDI, index);
   adx_minusdi_0
= iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_MINUSDI, index);
   
//--- Расчет индикатора ADX на предыдущем баре
   adx_plusdi_1
= iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_PLUSDI, index - 1);
   adx_minusdi_1
= iADX(Symbol(),PERIOD_CURRENT, ADXbars, PRICE_CLOSE, MODE_MINUSDI, index - 1);
   
//--- Условие для стрелки вверх
   
if (adx_plusdi_1 > adx_minusdi_1 && adx_plusdi_0 < adx_minusdi_0)
     
{
      up_buffer
[index] = Low[index] - 5.0 * Point; // Нарисуем стрелку вверх под ценой Low
     
}
   
//--- Условие для стрелки вниз
   
if (adx_plusdi_1 < adx_minusdi_1 && adx_plusdi_0 > adx_minusdi_0)
     
{
      down_buffer
[index] = High[index] + 5.0 * Point; // Нарисуем стрелку вверх под ценой High
     
}
   
}
//--------------------------------------------------------------------
//--- Условие для срабатывания оповещения на ПОКУПКУ -----------------
if (up_buffer[1] != EMPTY_VALUE && up_buffer[1] != 0 && SoundBuy) // Если буфер ВВЕРХ не пустой и не имеет значение 0 и звук покупки ИСТИНА
   
{
   
SoundBuy = false; //Звук на покупку ЛОЖНО (Оповещение сработало)
   
if (UseSound) PlaySound (SoundFile);   // Выполнить проигрование звукового файла оповещения
   
Alert("SixtySecondTrades(", Symbol(), ", ", Period(), ") — BUY!!!"); // Сообщение оповещения
   
}
if (!SoundBuy && (up_buffer[1] == EMPTY_VALUE || up_buffer[1] == 0)) SoundBuy = true; //
//--------------------------------------------------------------------
//--- Условие для срабатывания оповещения на ПРОДАЖУ -----------------
if (down_buffer[1] != EMPTY_VALUE && down_buffer[1] != 0 && SoundSell)// Если буфер ВНИЗ не пустой и не имеет значение 0 и звук продажу ИСТИНА
   
{
   
SoundSell = false;//Звук на продажу ЛОЖНО (Оповещение сработало)
   
if (UseSound) PlaySound (SoundFile);   // Выполнить проигрование звукового файла оповещения
   
Alert("SixtySecondTrades (", Symbol(), ", ", Period(), ") — SELL!!!");// Сообщение оповещения
   
}
if (!SoundSell && (down_buffer[1] == EMPTY_VALUE || down_buffer[1] == 0)) SoundSell = true;//
//--------------------------------------------------------------------
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
avatar

Kudryashov

  • 27 февраля 2020, 09:26
0
+ к уже сказанному… не плохо бы переписать его под свежую версию MT4… вопрос в другом будет ли он тогда также эффективно работать*think* 
avatar

Kudryashov

  • 26 февраля 2020, 11:19
+1
Ничего… хотя изменить следовало бы… ибо читать всякие li_8, li_0, gda_84 и прочее для меня лично просто овлптлуктпдтрлваоип...*loss* 
avatar

Kudryashov

  • 26 февраля 2020, 11:17
0
*think*  *think*  *think* 

Возможно… Давно хотел попробовать поработать с функцией iCustom…

*think*  *think*  *think* 

avatar

Kudryashov

  • 26 февраля 2020, 10:12
0
Для тех кто захочет разобраться… вот более приятный глазу вид:

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int ADXbars = 14;
extern int CountBars = 350;
extern string SoundFile="Alert.wav";
extern bool UseSound=true;
bool SoundBuy = False;
bool SoundSell = False;
double gda_84[];
double gda_88[];
double gd_92;
double gd_100;
double gd_108;
double gd_116;

int init()
{
//string ls_0;
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 108);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 108);
SetIndexBuffer(0, gda_84);
SetIndexBuffer(1, gda_88);
return (0);
}

int start()
{
if (CountBars >= Bars) CountBars = Bars;
SetIndexDrawBegin(0, Bars - CountBars);
SetIndexDrawBegin(1, Bars - CountBars);
int li_8 = IndicatorCounted();
if (li_8 < 0) return (-1);
if (li_8 < 1)
   
{
   
for (int li_0 = 1; li_0 <= CountBars; li_0++) gda_84[CountBars - li_0] = 0.0;
   
for (li_0 = 1; li_0 <= CountBars; li_0++) gda_88[CountBars - li_0] = 0.0;
   
}
for (int li_4 = CountBars; li_4 >= 0; li_4--)
   
{
   gd_92
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_PLUSDI, li_4 - 1);
   gd_100
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_PLUSDI, li_4);
   gd_108
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_MINUSDI, li_4 - 1);
   gd_116
= iADX(NULL, 0, ADXbars, PRICE_CLOSE, MODE_MINUSDI, li_4);
   
if (gd_92 > gd_108 && gd_100 < gd_116) gda_84[li_4] = Low[li_4] - 5.0 * Point;
   
if (gd_92 < gd_108 && gd_100 > gd_116) gda_88[li_4] = High[li_4] + 5.0 * Point;
   
}
//+------------------------------------------------------------------+
if (gda_84[1] != EMPTY_VALUE && gda_84[1] != 0 && SoundBuy)
   
{
   
SoundBuy = False;
   
if (UseSound) PlaySound (SoundFile);
   
Alert("SixtySecondTrades(", Symbol(), ", ", Period(), ") — BUY!!!");
   
}
if (!SoundBuy && (gda_84[1] == EMPTY_VALUE || gda_84[1] == 0)) SoundBuy = True;
if (gda_88[1] != EMPTY_VALUE && gda_88[1] != 0 && SoundSell)
   
{
   
SoundSell = False;
   
if (UseSound) PlaySound (SoundFile);
   
Alert("SixtySecondTrades (", Symbol(), ", ", Period(), ") — SELL!!!");
   
}
if (!SoundSell && (gda_88[1] == EMPTY_VALUE || gda_88[1] == 0)) SoundSell = True;
//+------------------------------------------------------------------+
return (0);
}
avatar

Kudryashov

  • 26 февраля 2020, 09:37
0
Функция алерта не возвращает никакие значения поэтому нет данных сработала она или нет. Найдите исходный код функции алерта тогда будет можно будет делать советники по алертам. Вы станете героем.*neo* 
avatar

Kudryashov

  • 26 февраля 2020, 09:12
0
Если условия истина то данные записываются в буфер. Если в буфере есть данные срабатывает стрелка (алерт). Если данные не записались в буфер нет стрелки(алерт). Даже если условия выполнены.
avatar

Kudryashov

  • 26 февраля 2020, 09:08
0
Мой первый массив :D 

int tickets_orders[];
//+------------------------------------------------------------------+
void close_all_position (string symbol,
                         
int magic
                       
)
{
//--------------------------------------------------------------------
int p = 0;
ArrayResize(tickets_orders,OrdersTotal(),1);
//--------------------------------------------------------------------
for (int index = 0; index < OrdersTotal(); index++)
   
{
   
if (OrderSelect(index, SELECT_BY_POS, MODE_TRADES) == FALSE) break;
   
if (OrderSymbol() == symbol)
     
{
     
if (OrderMagicNumber() == magic || magic == NULL)
         
{
         
if (OrderType() == OP_BUY || OrderType() == OP_SELL)
           
{
            tickets_orders
[p] = OrderTicket();
            p
++;
           
}
         
}
     
}
   
}
//--------------------------------------------------------------------
string comments="\n";
comments
+=((string)p+"\n");
Comment(comments);
Sleep(10000);
//--------------------------------------------------------------------
for (int index = 0;index<ArraySize(tickets_orders);index++)
   
{
   
if (OrderSelect(tickets_orders[index],SELECT_BY_TICKET, MODE_TRADES) == FALSE) break;
     
{
     
RefreshRates();
     
if(!OrderClose(OrderTicket(),OrderLots(),(OrderType()==OP_BUY?Bid:Ask),9999,clrNONE))
     
Alert("Problem with closing #",OrderTicket(),"; Error: ",GetLastError());
     
}
   
   
}
//--------------------------------------------------------------------


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


Странно, но он вроде как работает :D 
Однако вопросЫ:
1. Нет ли в коде ошибки?*tipatogo* 
2. Если понадобиться отдельно закрывать OP_BUY или OP_SELL тогда нужен 2 мерный массиив?
Спасибо!
avatar

Kudryashov

  • 17 февраля 2020, 17:24
0
*???*  а где код?
avatar

Kudryashov

  • 3 февраля 2020, 11:09
Загрузка...