Здравствуйте!
Вот такая проблема: нужно упаковать индикатор прямо в советник. Не спрашивайте зачем. Надо мне!
'Перенос кода индикатора в код эксперта. Строение индикатора.'
'Перенос кода индикатора в код эксперта. Общие схемы строения эксперта и индикаторных функций'
Огромное спасибо!
Чего-то никак не получается...
Попробуйте еще
//+------------------------------------------------------------------+ //| Stochastic.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property indicator_buffers 2 //---- input parameters int KPeriod=5; int DPeriod=3; int Slowing=3; //---- buffers double MainBuffer[]; double SignalBuffer[]; double HighesBuffer[]; double LowesBuffer[]; //---- int draw_begin1=0; int draw_begin2=0; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string short_name; //---- 2 additional buffers are used for counting. IndicatorBuffers(4); SetIndexBuffer(2, HighesBuffer); SetIndexBuffer(3, LowesBuffer); //---- indicator lines // SetIndexStyle(0,DRAW_LINE); // SetIndexBuffer(0, MainBuffer); // SetIndexStyle(1,DRAW_LINE); // SetIndexBuffer(1, SignalBuffer); //---- name for DataWindow and indicator subwindow label // short_name="Sto("+KPeriod+","+DPeriod+","+Slowing+")"; // IndicatorShortName(short_name); // SetIndexLabel(0,short_name); // SetIndexLabel(1,"Signal"); //---- // draw_begin1=KPeriod+Slowing; // draw_begin2=draw_begin1+DPeriod; // SetIndexDrawBegin(0,draw_begin1); // SetIndexDrawBegin(1,draw_begin2); //---- return(0); } //+------------------------------------------------------------------+ //| Stochastic oscillator | //+------------------------------------------------------------------+ int start() { int NewSize = iBars(NULL, NULL); //---- Проверка на смену нулевого бара if(ArraySize(MainBuffer[]) < NewSize) { //---- Установить прямое направление индексирования в массиве ArraySetAsSeries(SignalBuffer[], false); ArraySetAsSeries(HighesBuffer[], false); ArraySetAsSeries(LowesBuffer[], false); //---- Изменить размер эмулируемых индикаторных буферов ArrayResize(SignalBuffer[], NewSize); ArrayResize(HighesBuffer[], NewSize); ArrayResize(LowesBuffer[], NewSize); //---- Установить обратное направление индексирования в массиве ArraySetAsSeries(SignalBuffer[], true); ArraySetAsSeries(HighesBuffer[], true); ArraySetAsSeries(LowesBuffer[], true); } { int i,k; int counted_bars=IndicatorCounted(); double price; //---- if(Bars<=draw_begin2) return(0); //---- initial zero if(counted_bars<1) { for(i=1;i<=draw_begin1;i++) MainBuffer[Bars-i]=0; for(i=1;i<=draw_begin2;i++) SignalBuffer[Bars-i]=0; } //---- minimums counting i=Bars-KPeriod; if(counted_bars>KPeriod) i=Bars-counted_bars-1; while(i>=0) { double min=1000000; k=i+KPeriod-1; while(k>=i) { price=Low[k]; if(min>price) min=price; k--; } LowesBuffer[i]=min; i--; } //---- maximums counting i=Bars-KPeriod; if(counted_bars>KPeriod) i=Bars-counted_bars-1; while(i>=0) { double max=-1000000; k=i+KPeriod-1; while(k>=i) { price=High[k]; if(max<price) max=price; // <== Вот тут он почему-то выдаёт ошибку "'\end_of_program' - ending bracket '}'". Хотя несколькими строчками выше точно такой же код, только наоборот. k--; } HighesBuffer[i]=max; i--; } //---- %K line i=Bars-draw_begin1; if(counted_bars>draw_begin1) i=Bars-counted_bars-1; while(i>=0) { double sumlow=0.0; double sumhigh=0.0; for(k=(i+Slowing-1);k>=i;k--) { sumlow+=Close[k]-LowesBuffer[k]; sumhigh+=HighesBuffer[k]-LowesBuffer[k]; } if(sumhigh==0.0) MainBuffer[i]=100.0; else MainBuffer[i]=sumlow/sumhigh*100; i--; } //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; int limit=Bars-counted_bars; //---- signal line is simple movimg average for(i=0; i<limit; i++) SignalBuffer[i]=iMAOnArray(MainBuffer,Bars,DPeriod,0,MODE_SMA,i); //---- return(0); } //+------------------------------------------------------------------+
Да код еще тот. Вряд ли он будет когда-нибудь работать.
Напишите словами/формулами, что хотели сделать. Завтра попробую помочь.
Ну, хочу реализацию "Стохастика", чтобы функция возвращала его значение от 0 до 100. А уж он >50 или <50 -- я как-нибудь сама догадаюсь!..
:)
На этом пока всё. Что-то голова разболелась. Пойду отдыхать.
До свидания.
P.S. Спасибо. :)
Ну, хочу реализацию "Стохастика", чтобы функция возвращала его значение от 0 до 100. А уж он >50 или <50 -- я как-нибудь сама догадаюсь!..
:)
На этом пока всё. Что-то голова разболелась. Пойду отдыхать.
До свидания.
P.S. Спасибо. :)
Если хотите только Стохастика, то пользуйтесь Справочник MQL4 - Технические индикаторы - iStochastic
double iStochastic( | string symbol, int timeframe, int %Kperiod, int %Dperiod, int slowing, int method, int price_field, int mode, int shift) |
symbol | - | Символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ. |
timeframe | - | Период. Может быть одним из периодов графика. 0 означает период текущего графика. |
%Kperiod | - | Период(количество баров) для вычисления линии %K. |
%Dperiod | - | Период усреднения для вычисления линии %D. |
slowing | - | Значение замедления. |
method | - | Метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average). |
price_field | - | Параметр выбора цен для расчета. Может быть одной из следующих величин: 0 - Low/High или 1 - Close/Close. |
mode | - | Индекс линии индикатора. Может быть любым из значений идентификаторов линий индикаторов. |
shift | - | Индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад). |

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте!
Вот такая проблема: нужно упаковать индикатор прямо в советник. Не спрашивайте зачем. Надо мне! Я с трудом написала одну очень хитрую функцию, похожую на классический "Стохастик", и хочу с ней работать прямо изнутри советника. Потому что отдельный индикатор пока никак не получается. Да и не нужен он мне, главное -- его значение.
Итак: как, скажем, упаковать классический "Стохастик" в советник? Меня интересует только пересечение фиксированного значения. Например, что-то вроде:
if (iStochastic(0,0,5,3,3,MODE_SMA,0,MODE_MAIN,0)<50
Ну, или больше. Не суть. Но ничего рисовать не надо. А вот как именно получить это значение "изнутри", не вызывая внешних индикаторов, чтобы не ломать себе голову с их написанием?
Заранее признательна.