Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 189

 
Чем отличается метатрейдер 5 от предыдущего 4 с ним труднее работать или нет. Каждый брокер предлагает эти программы, а почему не бывает одной программы на всех брокеров, чтобы не устанавливать их по много.
Блог полезных и познавательных статей обо всем, на различную тематику категорий, все интересное, что бы Вам хотелось узнать и найти в материалах Интернет сети
Блог полезных и познавательных статей обо всем, на различную тематику категорий, все интересное, что бы Вам хотелось узнать и найти в материалах Интернет сети
  • es-blogy.ru
Если вами соблюдается диета при язве, то это поможет вам избежать частых обострений и свести их к минимуму; а чем меньше обострений, тем меньше количество медикаментозных препаратов вам нужно принимать. Инфекцию Н. pylori можно обнаружить двумя способами: провести анализ крови; анализ желудочного сока. Эндоскопическое или радиологическое...
 
koctik:
Чем отличается метатрейдер 5 от предыдущего 4 с ним труднее работать или нет. Каждый брокер предлагает эти программы, а почему не бывает одной программы на всех брокеров, чтобы не устанавливать их по много.
Скачайте оба терминала, поработайте на них на демо-счетах и сами узнаете.
 

Пытаюсь зделать функцию которая будет возвращать результат закрытой последней позиции (плюс или минус). Функция преднозначена для мультивалютного эксперта и должна выбрать  последньую закрытую позицию из всех валютных пар и здесь как раз что-то мне не получается. Можете поправить функцию?

double last_profit()
{  
int dir = 0;
double prof = 0;
ulong d_ticket;

if (HistorySelect(0,TimeCurrent())) 
    {
       int j=HistoryDealsTotal()-1;
       if(j>0)
      {
         d_ticket = HistoryDealGetTicket(j);
         if (d_ticket>0)
         { 
         mydeal.Ticket(d_ticket);          
         prof = mydeal.Profit();
         }
       }
     }
if(prof < 0)dir = -1;
if(prof > 0)dir = 1;
if(prof == 0)dir =0;

return(dir);
} 

 
Automated-Trading:

OBJ_ALL_PERIODS=2097151

Спасибо, но ничего не вышло. Проблема в том что вычесления периода D1 и...... должны отображатся на всех тайм фреймах, а не выходит бегает как попало. Что делать???
Файлы:
macd2.mq5  4 kb
 
Reshetov:

Что значит: неиспользуемые методы в своих классах? В ООП такое не практикуется. Нормальный программист в ООП, в отличие от алгоритмического программирования, создаёт классы со всеми необходимыми полями и методами, что называется на все случаи жизни, поскольку этот же класс может впоследствии пригодиться и в других приложениях или войти в библиотеку классов. Я уже не говорю про то, что даже в рамках одного проекта лучше сразу создавать полноценные классы, а не урезанные, чтобы потом не пришлось лазить по исходникам и добавлять необходимые поля и методы.

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

Конечно же в ООП исходники получаются большего объёма по сравнению с алгоритмическим программированием. Но это не недостаток, а преимущество, т.к. значительная часть "лишнего" кода в данном проекте, может быть многократно применена в других проектах.

Не надо пытаться лепить горбатого, т.е. засовывать всё в один класс. Нужно создавать библиотеки классов, т.е. разбивать функционал по отдельным классам и не забывать вставлять комментарии к этому хозяйству и тогда всё упорядочивается. Я тоже первоначально, когда начал изучать Java после Pascal пытался по старой привычке всё делать одним куском, т.е. практически вместо того, чтобы использовать ООП, создавал один класс, в который запихивал всё необходимое для конкретной задачи, т.е. как в алгоритмическом программировании. Получалась неуниверсальная каша, которую в дальнейшем уже невозможно никуда применить, не говоря уже про то, что ногу сломишь разбираться в таком коде.

Я это все прекрасно понимаю. Но хотя бы показать неиспользуемые private переменные как это сделано в VisualStudio можно?

Дело еще в том, что классы проектируется в процессе разработки. Учесть все еще до создания просто невозможно. Поэтому создаются каркасные классы с минимально возможным функционалом. В процессе взаимодействия этих каркасных классов начинает вырисовывается общая архитектура. Часть методов просто удаляется, часть переходит в секцию private, часть - мигрирует из одного класса в другой. В процессе этого неизбежно появляются забытые переменные, методы и даже целые классы. Это нормально т.к. это нечто иное как принцип Окамы в действии - сначала пишем плохой, избыточный код. Затем более ясно формализуем задачу и часть сущностей просто исчезает. Избыточность сходит на нет. И вот именно в этом процессе помощь компилятора была бы весьма кстати - видеть неиспользуемые переменные и хотя бы private методы было бы весьма кстати.

 

Здраствуйте.

Я так понимаю что функция  OnCalculate () которая применяется в индикаторах генерирует сама по себе,т.е. без наступления события изменения цены,

какую функцию в индикаторе можно применить в индикаторе, которая генерировала только с наступлением изменения цены. Спасибо

 
Vikon:

Здраствуйте.

Я так понимаю что функция  OnCalculate () которая применяется в индикаторах генерирует сама по себе,т.е. без наступления события изменения цены,

какую функцию в индикаторе можно применить в индикаторе, которая генерировала только с наступлением изменения цены. Спасибо

Событие Calculate генерируется только для индикаторов сразу после посылки события Init и при любом изменении ценовых данных. Обрабатывается функцией OnCalculate. Так же при изменении истории (при подкачке истории) будет генерироваться OnCalculate

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

 
barabashkakvn:

Событие Calculate генерируется только для индикаторов сразу после посылки события Init и при любом изменении ценовых данных. Обрабатывается функцией OnCalculate. Так же при изменении истории (при подкачке истории) будет генерироваться OnCalculate

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

Вот здесь происходит какая то зацикленность, т.е. он постоянно генерирует и при изменении периода изменяются показания. В чем ошибка? 

#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |

int EMA1=12;
int EMA2=26;
int SMA=9;

ENUM_TIMEFRAMES period_macd;
datetime t_MACD[]; 
double MACD [];
bool high_low=false;
int shift_nachalo;
double w_MACD[],d_MACD[];       
int w_MACD_handle,d_MACD_handle; 

int barDown=0;
int barUP=0;

//+------------------------------------------------------------------+  return(0);
int OnInit()
  {
w_MACD_handle=iMACD(NULL,PERIOD_W1,EMA1,EMA2,SMA,PRICE_CLOSE);
d_MACD_handle=iMACD(NULL,PERIOD_D1,EMA1,EMA2,SMA,PRICE_CLOSE);
ArraySetAsSeries(MACD,true); 
ArraySetAsSeries(t_MACD,true);  
ArraySetAsSeries(w_MACD,true);
ArraySetAsSeries(d_MACD,true);
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+  MACD_handle=iMACD(NULL,PERIOD_W1,EMA1,EMA1,SMA,PRICE_CLOSE);
//| 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[])
  {

ObjectsDeleteAll(0,0,-1);
////////////////////////////////////////////////////////
 period_macd=PERIOD_D1;
 CopyBuffer(d_MACD_handle,0,0,1000,d_MACD);
 ArrayCopy(MACD,d_MACD,0,0,WHOLE_ARRAY);
 nachalo();
 
  ObjectCreate(0,"lin_2",OBJ_VLINE,0,t_MACD[shift_nachalo],0);
  ObjectSetInteger(0,"lin_2", OBJPROP_BACK,true);
  ObjectSetInteger(0,"lin_2",OBJPROP_TIMEFRAMES,OBJ_ALL_PERIODS);
  ObjectSetInteger(0,"lin_2",OBJPROP_COLOR,clrYellow);
  ObjectSetInteger(0,"lin_2",OBJPROP_STYLE,1);  
 
   return(rates_total);
  }
//+------------------------------------------------------------------+
//////////////////////////////////////////////////////////////////////////////
void nachalo() //начало новой волны
{
 double low_nachalo[],high_nachalo[];
CopyTime(NULL,period_macd,0,1000,t_MACD);
  if (MACD[1]>0)
 {high_low=false;
  while (MACD[barDown]>0)
  {barDown++;}
  barUP=barDown;
  while (MACD[barUP]<0)
  {barUP++;}  
  CopyLow(NULL,period_macd,0,barUP,low_nachalo);
  ArraySetAsSeries(low_nachalo,true); 
  shift_nachalo=ArrayMinimum(low_nachalo,barDown-1,barUP-(barDown-1));
  }
  
 if (MACD[1]<0)
 {high_low=true;
  while (MACD[barUP]<0)
  {barUP++;}
  barDown=barUP;
  while (MACD[barDown]>0)
  {barDown++;} 
  CopyHigh(NULL,period_macd,0,barDown,high_nachalo); 

  ArraySetAsSeries(high_nachalo,true);

  shift_nachalo=ArrayMaximum(high_nachalo,barUP-1,barDown-(barUP-1));
 }}
Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
Файлы:
macd2.mq5  4 kb
 
Vikon:

Вот здесь происходит какая то зацикленность, т.е. он постоянно генерирует и при изменении периода изменяются показания. В чем ошибка? 


Как правильно на форуме вставить код.

 
Vikon:


Обратите внимание на ошибку:

Нет привязанных индикаторных буферов

Используйте: 

//---- превращение динамических массивов в индикаторные буферы
   SetIndexBuffer()
Так же прочтите статью "Как написать индикатор в MQL5"



Причина обращения: