[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 134

 
klyuchnikk:

Всем здравствуйте.

Есть советник, работает на истории (для анализа). В нем задается вручную параметр - время (часы, минуты) выставления ордеров. Прогнав советник в заданном интервале дат, меняю время ордеров и прогоняю снова. Так 96 раз (через 15 мин) в день. Как его зациклить, чтобы он сам это делал?

В помощь
 
artmedia70:
Ещё раз спрошу: Когда именно хотите выставить ордер? Не вашим кодом ответьте (не охота в нём разбираться - своих кодов предостаточно к разбору), а просто словами,

например: хочу выставить отложку выше/ниже МАшки на такую-то дистанцию при условии, что ... тыры-пыры-ё-моё ...

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


 На данный момент задача такая: fastMa пересекла slowMa вверх... значит мы ищем где купить. Далее ждём когда цена т.е. Ask (т.к. рассматриваем покупки) дойдёт до fastMa (ну я так понимаю точное значение тут не будет, нужен +- какое-то отклонение, а это переенная i_thresholdFromMa) и как только цена подошла к fastMa +- i_thresholdFromMa эксперт должен выставить BUYSTOP по цене (fastMa + buyHear * pt).

То что у меня вышло в одном терминале не работало, в другом работало, в третьем работает не всегда. В общем что-то не то.. 

Последний вариант функции покупки вот:

//+-------------------------------------------------------------------------------------+
//| Открытие длинной позиции                                                            |
//+-------------------------------------------------------------------------------------+
bool OpenBuy()
{
   int ticket = -1;
   double OOP = fastMa + buyHear * pt;
   
   if ((ND(OOP) - Ask) >= g_stopLevel)           
   {
       if (ND(OOP) > Ask)           // Проверка что цена открытия выше Ask, т.к. у нас вход отложенником
       {
           ticket = OrderSend(Symbol(), OP_BUYSTOP, 0.1, ND(OOP), 3, 0, 0, NULL, i_magic, 0);
       }
   }
   if (ticket > 0)
   {
       return (true);
   }
   else
    
   Alert (GetLastError());
}
Вот входные параметры:
extern double i_thresholdFromMa = 5;                           // Отступ от МА
extern double buyHear = 10,                                    // Расстояние от МА до отложки на бай

int init()
{
   if (Digits == 1 || Digits == 3 || Digits == 5)
       pt = Point * 10;
}

 

 Ошибки на скрине видны (в OrderSend() подаётся цена выше красной машки, а ордер как видно на скрине - ниже....):

косяк с ценой открытия 

artmedia70:
И ещё: если у вас fastMA и slowMA определены как глобальные, зачем их в функции передаёте? Все функции их и так видят, без передачи их параметров в вызываемую функцию.

 А раньше были не глобальными, были объявлены в канкретных функциях, а не в старте. Но по-скольку употреблялись ни в одной функции, каждый раз их получить было как-то скажем так признаком "не хорошего тона программиста" и самому не комфортно, когда в разные функциях идентичные строки кода.

 Артём, как считаешь я верно в старте машку получаю? Имею ввиду что на каждом тике будет получаться значение. Не накладно ли это? По-скольку я сам по образованию далеко не программист, то для мне эти вопросы иной раз подымаются..

 
Tincup:

накинул. ответ не совсем мне понятен поэтому переспрошу еще раз. Я правильно вас понял что при формулировке торговых условий надо

надо использовать значение МА на соответствующее количество баров назад но не то значение которое помечено на рисунке желтой стрелкой.

Рисунок нарисовал так как понял ваш ответ. 



 На самом деле вопрос какой-то не корректный. Дело не в том, какое смещение кривой, а в том, где на каком баре нужно эксперту получить значение из буфера. Вот это и нужно понимать. А соответствия между отклонением и получением значения из буфера - НЕТ.
 

здравствуйте

первый вопрос


А=истина

если значение Imacd (Основная линия) 15 минут назад было меньше чем 30 минут назад

 
Claus084:

здравствуйте

первый вопрос

А=истина

если значение Imacd (Основная линия) 15 минут назад было меньше чем 30 минут назад

Нет, лучше вперёд!
 
double iMACD( string symbol, int timeframe, int fast_ema_period, int slow_ema_period, int signal_period, int applied_price, int mode, int shift)
Расчет индикатора Moving Averages Convergence/Divergence. В тех системах, где ОsМА называют гистограммой МАКД, данный индикатгор изображается в виде двух линий. В клиентском терминале схожденние/расхождение скользящих средних рисуется в виде гистограммы.
Параметры:
symbol   -   Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.
timeframe   -   Период. Может быть одним из периодов графика. 0 означает период текущего графика.
fast_ema_period   -   Период усреднения для вычисления быстрой скользящей средней.
slow_ema_period   -   Период усреднения для вычисления медленной скользящей средней.
signal_period   -   Период усреднения для вычисления сигнальной линии.
applied_price   -   Используемая цена. Может быть любой из ценовых констант.
mode   -   Индекс линии индикатора. Может быть любым из значений идентификаторов линии индикаторов.
shift


вот тут и вопрос


правильно ли я понимаю
  -   Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).


количество каких периодов?
или как взять значение macd не текущего бара а предыдущего?\

int start ()  
     {      
       bool A=true
if(iMACD(NULL,15,12,26,9,PRICE_CLOSE,MODE_MAIN,1)<iMACD(NULL,15,12,26,9,PRICE_CLOSE,MODE_SIGNAL,2))
  {
   A==true;
   }
   return;
}


 

Нажимайте на периодов графика и смотрите, какие периоды! А предыдущий бар (shift = 1) текущему бару (shift = 0) найдёте на последнем месте:

double MA0 = iMACD(symbol,timeframe,fast_ema_period,slow_ema_period,signal_period,applied_price,mode,0);//текущий бар
double MA1 = iMACD(symbol,timeframe,fast_ema_period,slow_ema_period,signal_period,applied_price,mode,1);//предыдущий бар


А лучше начинайте штудировать учебник С. Ковалёва!
 
Уважаемые, подскажите, в режиме тестирования по "ценам открытия" тестер использует только цены открытия или цены открытия, закрытия, хай и лоу?
 
xant:

И снова здравствуйте. 

Подскажите пожалуйста, как решить следующую задачу.

Есть индикатор в откомпилированном виде. Код недоступен.  Индикатор отражает в основном окне графика ценовые уровни. Я хочу использовать эти уровни для своего советника, но, как выяснилось, вызвать индикатор с помощью функции iCustom() невозможно -  отображаемые уровни являются графическими объектами. Возможно ли считывать данные иначе, например через имена объектов и время? Имена всех уровней известные (есть в настройках индикатора), объекты обновляются 1 раз в неделю.

 Сразу скажу - в программировании разбиваюсь пока весьма поверхностно.  Буду благодарен за содержательный ответ.

Ход мысли правильный. Графические объекты распознаются по имени. Уровни могут задаваться двумя (основными) типами графических объектов: OBJ_TREND (трендовая линия) и OBJ_HLINE (горизонтальная линия). Вам, как я понимаю, нужны два свойства этих объектов (цена и, возможно, время):

    //---- Уровень для горизонтальной линии
    double ld_Level = ObjectGet (Name, OBJPROP_PRICE1);
    //---- Уровень для трендовой линии на текущем баре
    ld_Level = ObjectGetValueByShift (Name, Bar);
    datetime ldt_Time = ObjectGet (Name, OBJPROP_TIME1);
Как-то так.
 
Sancho77:
Уважаемые, подскажите, в режиме тестирования по "ценам открытия" тестер использует только цены открытия или цены открытия, закрытия, хай и лоу?

да , только цены открытия , поэтому есть особенно важно учитывать при анализе работы соетника. Например если хвост свечи пробивал ваш канал, то советник может это незаметить, но эт оможно прописать в логику программы и впринципе решить проблему

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