Навигатор по форуму и ответы на часто задаваемые вопросы. Настоятельно Рекомендуется к Прочтению! - страница 4

 

Как получить тиковый график и строить индикаторы на нём?

granit77: Для этого вам понадобится:

- Сборщик тиков в csv файл
- Эксперт-строитель эквиобъемных графиков с TicksInBar=1
- Ознакомиться с описанием и правилами их работы в этой статье

 

SMS извещение о состоянии советника


задался задачей информирование пользователя о состоянии советника (советник работает на сервере) через SMS

какие почтовые серверы поддерживают отправку сообщений на телефон кроме майл.ру? Интересует отправка на операторов Life и Kyivstar

FAQ: У ваших операторов для вас регистрируется почтовый ящик вида 380ХХХХХХХХХ@sms.kyivstar.net или типа такого (точно не знаю). Вы должны активировать его (звоните оператору) и слать почту на этот ящик. Тем самым вы будете получать всю почту на этот ящик в виде СМС.


Для Kyivstar: пустое смс на номер 7021 активирует, 7020 отключает ящик. http://www.kyivstar.ua/ru/personal/prepaid/services/smsmmse-mail/
кириллица в сообщении не распознается

 


Ну так кто-нибудь может помочь написать советник по моей профитной стратегии ?

Timbo: Да, конечно же. И не надо так кричать... Желающих помочь более, чем достаточно.
Надо только поработать чуть-чуть по этой замечательной системе ручками на реальном счёте, накопить денежку и тихонечко, шёпотом (прибыльные системы не любят шума), заказать написание советника профессиональным программистам.
Если же денежку заработать руками по этой системе не получаится, то значит и кодировать её смысла не было.

 


Как получить Open и Close, другой валюты, не открывая ее графика?

Mathemat: Смотрите функции iOpen, iClose.

 


Существует ли возможность программно узнать - выделен ли объект (трендовая, горизонтальная, пользовательская средняя и т.д.) на графике?

Vinin: К сожалению, в функциях MQL4 нет таких возможностей.

 
Как можно программно определить подкачку истории в индикаторе?

Vinin: Для мультивалютников есть один способ, для других другой. Вот пример начала стандартного индикатора:
int start()
{
  int counted_bars=IndicatorCounted();
  int limit=Bars-counted_bars-1;
  if (limit>1) limit=Bars-1; // если limit больше 1, значит произошло изменение истории
      
   // цикл обработки баров
  for (int i=limit;i>=0;i--) { }
  return(0);
}

Обычно limit равно 0 или 1, если больше 1 - то полный перерасчет

 


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


Roman:

 

Нужно наложить боллинджера на рси, руками это сделать можно, а вот как сделать это программно?


sergeev: Болинджер - это МА отодвинутая вверх и вниз на StdDev. Вы можете сделать это двумя путями.

1. Если целочисленное изменение отклонения Deviat вас устраивает, то можете воспользоваться функцией iBandsOnArray

2. Если же надо считать также и десятичные доли Deviat, то прийдется использовать функции iMAOnArray и iStdOnArray

В коде это выглядит так:

#property indicator_separate_window
#property indicator_buffers 4
#property indicator_minimum 0
#property indicator_maximum 100

#property indicator_color1 SkyBlue
#property indicator_color2 LimeGreen
#property indicator_color3 LimeGreen
#property indicator_color4 LimeGreen
#property indicator_style2 STYLE_DOT

extern int rsiPeriod=14;
extern int rsiPrice=PRICE_CLOSE;
extern int bbPeriod=20;
extern int bbShift=0;
int bbMethod=MODE_SMA;
extern double bbDeviat=2;

double rsi[], ma[], up[], dn[], stdev[];
//------------------------------------------------------------------    init
int init()
{
  int i=0;
  SetIndexBuffer(i, rsi); SetIndexStyle(i, DRAW_LINE); SetIndexLabel(i, "RSI"); i++;
  SetIndexBuffer(i, ma); SetIndexStyle(i, DRAW_LINE); SetIndexLabel(i, "MA"); i++;
  SetIndexBuffer(i, up); SetIndexStyle(i, DRAW_LINE); SetIndexLabel(i, "UP"); i++;
  SetIndexBuffer(i, dn); SetIndexStyle(i, DRAW_LINE); SetIndexLabel(i, "DN"); i++;
  IndicatorBuffers(5);
  SetIndexBuffer(i, stdev); SetIndexStyle(i, DRAW_NONE); // добавочный буфер расчета
  return(0);
}
//------------------------------------------------------------------    start
int start()
{
  int count=IndicatorCounted(); if (count<0) return; // если ошибка расчета
  int lim=Bars-count; if (lim>1) lim=Bars-1; // если нерасчитано более 1 бара, то полный пересчет
  // 1. получаем массив RSI
  for (int i=lim; i>=0; i--) rsi[i]=iRSI(Symbol(), Period(), rsiPeriod, rsiPrice, i);
  // 2. строим на основе RSI - МА (средняя линия болинджера), StdDev и Верхнюю и Нижнюю границу Боллинджера
  for (i=lim; i>=0; i--) 
  {
    ma[i]=iMAOnArray(rsi, 0, bbPeriod, bbShift, bbMethod, i); // средняя линия
    stdev[i]=iStdDevOnArray(rsi, 0, bbPeriod, bbShift, bbMethod, i); // отклонение
    up[i]=ma[i]+bbDeviat*stdev[i]; // верхняя граница
    dn[i]=ma[i]-bbDeviat*stdev[i]; // нижняя граница
  }
  return(0);
}
Файлы:
 


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


PapaYozh:

Lots * MarketInfo(Symbol(),MODE_TICKVALUE) / (MarketInfo(Symbol(),MODE_TICKSIZE) / MarketInfo(Symbol(),MODE_POINT))
 


Как запрограммировать работу советника по открытию бара?

sergeev: для этого необходимо создать параметр, который будет хранить время бара.
Например назовем его last

datetime last=0;

int start()
{
  if(last>=Time[0]) return;  // если время бара уже проверено то выходим сразу, т.е. ждем новый бар
  last=Time[0]; // запомнили время бара для последующего тика
  
  /*
  далее ваш код
  */
}

ВАЖНО!

В блоке /* ваш код */ могут быть осуществлены операции, которые не выполнились с первого раза. Например ошибка закрытия/открытия ордера типа реквот. В этом случае, если произойдет такая ошибка то повторная отправка запроса отправка не произойдет до следующего бара, так как строка last>=Time[0] не пропустит дальше на выполнение.

Поэтому правильнее присваивание last=Time[0] делать только в том случае, когда все требуемые операции при открытии нового бара выполнены.


выглядеть будет примерно так:

datetime last=0;

int start()
{
  if(last>=Time[0]) return;  // если время бара уже проверено то выходим сразу, т.е. ждем новый бар
  
  // далее ваш код
  // ...
  if (требуемая_операция_успешна) last=Time[0]; // запомнили время бара для последующего тика
  // ...
}
Причина обращения: