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

 
Roman.:

Он уже спрашивал в другой ветке об этом. Ответили... Но он в коде не понимает - сам писал об этом.

Ему скрипт нужен (готовое решение - нажал клавишу (запустил скрипта) - на экране посмотрел).



 

Остаётся одно, пригласить его инвестировать наши счета! :)) 

 
borilunad:


 

Остаётся одно, пригласить его инвестировать наши счета! :)) 


Идея хорошая, но трудно реализуемая
 

 

hoz:

Чё та меня уже совсем запутали. Вот 3 функции, каждая из которых получает свой канкретный сигнал по конкретному индюку.

Это функция получает общий сигнал от всех индюков, и принимает решение КУПИТЬ или ПРОДАТЬ.

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

int GetCrossingMa(double& i_maFast1, double& i_maFast2, double& i_maSlow1, double& i_maSlow2)

int GetStochSignal(double& stochD1, double& stochD2, double& stochK1, double& stochK2)

void GetMomentumSignal() , в принципе тоже можно запихнуть туда же.

Таким образом получается, что все рассчёты индюков будут в одной главной ф-ции получения сигнала. Тут же всё логично..

TarasBY: 

Виктор! Логика у Вас присутствует, а вот знаний пока маловато. Первое, если не бросите это дело, поможет пойти дальше учебника, а чтобы "победить" второе - с него же (с учебника) и надо пока начинать. Вы не готовы (пока) строить СВОЮ логическую структуру кода, вернитесь к азбучному варианту.
P.S. Что "бросается в глаза" в Вашем коде:

в функции GetSignal() для поиска пересечения двух линий МОЖНО использовать цикл for, НО ЛУЧШЕ использовать цикл while, хотя это личные предпочтения. А для начала, чтобы код исполнял Вами озвученное, нужно перенести скобочку, как и в "Казнить, нельзя помиловать". Почему-то в этой (результирующей) функции отсутствуют рузультаты двух функций: GetStochSignal() и GetMomentumSignal(), - это НЕМНОЖКО не логично.

в функциях  GetCrossingMa() и GetStochSignal() нет НИКАКОГО смысла передавать параметры по ссылкам, потому, что это имело бы смысл, если бы эти переменные внутри функции МЕНЯЛИ свои значения.

функция  void GetMomentumSignal() НИЧЕГО не возвращает.

 Хотя я допускаю, что со стороны "хуже видно"... :)))

Вот альтернативный вариант функции, получающей сигналы с МАш(ки)ек:  

//IIIIIIIIIIIIIIIIIII==================CONSTANS=================IIIIIIIIIIIIIIIIIIIIII+
#define       BULL          0
#define       BEAR          1
#define       STOP         -1
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
extern int    Use_ChangeTrend.MA      = 0;           // 0 - off; Брать сигнал на смене тренда: 
//1 - ТОЛЬКО на первом; 2 - ТОЛЬКО не на первом; 3 - на всех
extern double MA_K_Period             = 3.0;         // коэффициент получения периода 2-ой МАшки.
extern int    MA_Period               = 14;
/*extern*/ int    MA_Shift                = 0;
extern int    MA_Method               = 7;
extern int    MA_Price                = 7;
/*extern*/ int    Color_Mode               = 0;
int           bia_PeriodMA[2];
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Получаем сигнал по наклону MA или по пересечению 2-х MA                    |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
int fGet_SignalMA (string fs_Symbol,                        // Symbol
                   int fi_TF,                               // Таймфрейм
                   double fd_Deviation = 0,                 // расхождение м/у МАшками
                   bool fb_ControlBeginChangeTrend = False, // Контроль начала смены тренда
                   int fi_BarSignal = 1,                    // Бар на котором считываем сигнал
                   int fi_VerificationBars = 1)             // Количество баров для подтверждения сигнала
{
    static int li_preSignal = STOP;
    double lda_MA[2];
    bool   lb_twice = (MA_K_Period > 1.0), lb_Condition;
    int    li_BAR = fi_BarSignal, li_Trend = STOP, li_VerificationBars = 0, li_cmd = 1;
//----
    //---- Если работаем с 2-мя МАшками
    if (lb_twice)
    {
        for (int li_IND = 0; li_IND < 2; li_IND++)
        {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, bia_PeriodMA[li_IND], MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR);}
        //---- На 1-ом проверяемом баре фиксируем расхождение МАшек
        double ld_Deviation = fControl_Deviation (lda_MA, lb_Condition, li_cmd, li_Trend, fd_Deviation);
    }
    //---- Если работаем с 1-ой МАшкой
    else
    {
        for (li_IND = 0; li_IND < 2; li_IND++)
        {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, MA_Period, MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR + li_IND);}
        double ld_Price = fGet_PriceOnBar (PRICE_TYPICAL, fs_Symbol, fi_TF, li_BAR);
        //---- На 1-ом проверяемом баре фиксируем расхождение МАшек
        ld_Deviation = fControl_Deviation (lda_MA, lb_Condition, li_cmd, li_Trend, fd_Deviation);
        if (NDD (li_cmd * (lda_MA[0] - ld_Price)) >= 0.0) return (STOP);
    }
    //---- Если фиксируем на баре пересечение или горизонтальное расположение МА - выходим
    if (ld_Deviation == 0.0) return (STOP);
    int li_cnt = 0;
    while (lb_Condition == true)
    {
        li_BAR++;
        //---- Собираем показания МАшек в массив
        if (lb_twice)
        {
            for (li_IND = 0; li_IND < 2; li_IND++)
            {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, bia_PeriodMA[li_IND], MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR);}
            bool lb_AddCondition = true;
            li_cnt++;
        }
        else
        {
            for (li_IND = 0; li_IND < 2; li_IND++)
            {lda_MA[li_IND] = iCustom (fs_Symbol, fi_TF, "AllAverages_v2.51", fi_TF, MA_Period, MA_Shift, MA_Method, MA_Price, Color_Mode, 0, li_BAR + li_IND);}
            ld_Price = fGet_PriceOnBar (PRICE_TYPICAL, fs_Symbol, fi_TF, li_BAR);
            lb_AddCondition = (NDD (li_cmd * (lda_MA[0] - ld_Price)) < 0.0);
        }
        //---- Фиксируем расхождение МАшек или наклон 1-ой МА
        ld_Deviation = NDD (lda_MA[0] - lda_MA[1]);
        //---- Определяем условия контроля пересечения МАшек или изменение наклона
        if (li_Trend == BULL) lb_Condition = (ld_Deviation >= 0.0); else lb_Condition = (ld_Deviation <= 0.0);
        //---- Производим подсчёт баров, на которых выполняется означенное расхождение
        if (lb_AddCondition)
        {
            if (fd_Deviation != 0.0) {if (MathAbs (ld_Deviation) >= fd_Deviation) li_VerificationBars++;}
            else li_VerificationBars++;
        }
        else li_cnt++;
        //---- Если не отслеживаем начало смены тренда
        if (!fb_ControlBeginChangeTrend) {if (li_VerificationBars == fi_VerificationBars) return (li_Trend);}
        else
        {
            //---- Если баров, на которых выполняются заданные нами условия, > fi_VerificationBars - выходим
            if (li_VerificationBars > fi_VerificationBars) {li_preSignal = STOP; return (STOP);}
            else if (!lb_Condition)
            {
                if (li_VerificationBars == fi_VerificationBars) {return (li_Trend);}
                //---- Если не набрали нужное количество подтверждений сиганала после пересечения
                // или смены наклона - выходим
                else if (li_VerificationBars < fi_VerificationBars) return (STOP);
            }
        }
        //---- Предусматриваем уход от зацикливания (на начале отсчёта)
        if (li_cnt > MA_Period) return (STOP);
    }
//----
    return (STOP);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
//|  Автор : TarasBY, taras_bulba@tut.by                                              |
//+-----------------------------------------------------------------------------------+
//|        Контролируем расхождение 2-ух МАшек или наклон 1-ой МАшки                  |
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+
double fControl_Deviation (double ar_MA[],           // массив входящих значений
                           bool& fb_Condition,       // состояние тренда
                           int& fi_cmd,              // "знак тренда"
                           int& fi_Trend,            // тренд
                           double fd_Deviation = 0)  // расхождение м\у МАшками
{
    double ld_Deviation = NDD (ar_MA[0] - ar_MA[1]);
//----
    //---- Если фиксируем на баре пересечение или горизонтальное расположение МА - выходим
    if (ld_Deviation == 0.0) return (0.0);
    //---- Проверяем расхождение на нужную величину (если задано)
    if (fd_Deviation != 0.0) {if (MathAbs (ld_Deviation) < fd_Deviation) return (0.0);}
    if (ld_Deviation > 0.0) {fb_Condition = (ld_Deviation >= 0.0); fi_Trend = BULL;}
    else {fb_Condition = (ld_Deviation <= 0.0); fi_Trend = BEAR; fi_cmd = -1;}
//----
    return (ld_Deviation);
}
//IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII+

 Как можно понять из комментариев, сигнал можно получить по наклону одной МА (при MA_K_Period <= 1.0) или по пересечению 2-ух МА (при MA_K_Period > 1.0). Период 2-ой Машки расчитывается самостоятельно (за пределами данной функции): 

    bia_PeriodMA[0] = MA_Period;
    bia_PeriodMA[1] = MA_Period * MA_K_Period;

В функции можно задать и условие на расхождение 2-х Машек (при fd_Deviation > 0.0). Также можно отслеживать факт пересечения (fb_ControlBeginChangeTrend = TRUE) или просто фиксировать нахождение Fast и Slow относительно друг друга.

Чтобы посмотреть как работает этот код, в архив положил индикатор, который по сигналам данной функции рисует стрелочки. Запускаемся через шаблон Signal_MA.tpl (для одной МА) или Signal_MA2.tpl (для 2-ух). Кстати, и МАшки могут браться разные.

Файлы:
signal_ma.zip  185 kb
 
TarasBY:

Вот альтернативный вариант функции, получающей сигналы с МАш(ки)ек: 

 Как можно понять из комментариев, сигнал можно получить по наклону одной МА (при MA_K_Period <= 1.0) или по пересечению 2-ух МА (при MA_K_Period > 1.0). Период 2-ой Машки расчитывается самостоятельно (за пределами данной функции): 

В функции можно задать и условие на расхождение 2-х Машек (при fd_Deviation > 0.0). Также можно отслеживать факт пересечения (fb_ControlBeginChangeTrend = TRUE) или просто фиксировать нахождение Fast и Slow относительно друг друга.

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


Захотите ускорить работу индикатора - обращайтесь
 
Vinin:

Захотите ускорить работу индикатора - обращайтесь
Если индикатора, то какого? - который Машки считает? В любом случае - будет интересно!
 

Доброго дня! Модификация ордера-ошибка 4051.   Час ужу думаю.      Ну вроде верный там параметр!!!  Короче, побуквено. Параметр цена- цена открытия ордера, OrderOpenPrice(), стандартно.

Стоп несём на 10 пунктов ниже цены открытия ордера, а цену запромнили. Запомнили в переменной   tsena , при открытии ордера.

Ордеров два, один с профитом другой без. Вот, вроде понятно расказал. Откуда ошибка?? Что же ему ещё?

Да, условие вроде понятно, хоть это уже не к делу. Тоесть, цена ушла на 30 пунктов-условие сработало.( tsena+30*Point ).

Носим один раз  perenos=true; Эти условия собственно вроде работают.

Сам уж не знаю как думать.  

Собственно  Носим один раз  perenos=true; Эти условия наблюдать-то и не пришлось, т.к. никуда и не носит. 


bool napravlenieCCI=false;
 if( CCI_50S<100&&CCI_50>100 ||CCI_50S<0&&CCI_50>0|| CCI_50S<-100&&CCI_50>-100  )napravlenieCCI=true;// if( CCI_50S>CCI_50&& )napravlenieCCI=false;
 
 bool wishseLMA=false;//Свеча закрывается или находится выше LMA
 if (Bid>LMA_100) wishseLMA=true;Print ("до условияsrabotka    " ,srabotka );Alert("до условияsrabotka    " ,srabotka );
 
 if (EMA_20S>EMA_10S&&EMA_20<EMA_10&&napravlenieCCI&&wishseLMA&&!srabotka) {/// нашли пирисечение сверху вниз и направление CCI вверх
 RefreshRates();
           int tacket=OrderSend (Symbol( ), OP_BUY, lot,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Ask- (35*Point),Digits), 
           NormalizeDouble( Ask+( 45*Point),Digits), NULL, 450, 0, CLR_NONE);
           int Error=GetLastError();if (Error==0){  
           Sleep(2000); RefreshRates(); double profit = NormalizeDouble( Ask+( 45*Point),Digits); tsena=Ask; perenos = false;
           int tucket=OrderSend (Symbol( ), OP_BUY, lot,NormalizeDouble(Ask, Digits), 5, NormalizeDouble( Ask- (35*Point),Digits),
           0, NULL, 450, 0, CLR_NONE); 
           if (Error==0)   
           srabotka= true; }}
           
           if (Error!=0){ string errorcomment = "Ошибка открытия  ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);}
 
 
 if(tsena+30*Point<Ask&&!perenos){ 
 OrderModify(  tacket, OrderOpenPrice(), tsena-10*Point, OrderTakeProfit(), 0, CLR_NONE);
 Error=GetLastError();if (Error==0){  
 OrderModify(  tucket, OrderOpenPrice(), tsena-10*Point, OrderTakeProfit(), 0, CLR_NONE);
 Error=GetLastError();if (Error==0){  
 perenos=true;}}} 
 
 if (Error!=0){  errorcomment = "Ошибка модификайции ордера OP_BUY"  + " " + Symbol() +  " " + ErrorDescript(Error); 
            Print (errorcomment);BreakPoint();} 
 

Там собствено есть ещё нималоважный параметр-тикет. Однако я его присваиваю переменной так int tacket=OrderSend и так int tucket=OrderSend,

а использую соотвецтвено так  OrderModify( tacket,      и короче формально я ошибки там как бы не вижу!!!

 

Во, блин...   2012.11.14 22:40:17 2012.08.16 15:30 василийпрр EURGBP,M30: 1Error 0 tacket 5     то есть ордер откріли, тикет присвоили.

 

А чуть дальше он уже равен нолю! То есть внутри следующего участка кода, что занимается модификацией. 

2012.11.14 23:05:27 2012.08.17 11:03 василийпрр EURGBP,M30: tacket 0 OrderOpenPrice() 0.7845 tsena-10*Point 0.7835 OrderTakeProfit() 0.789    

Вне указаного віше участка кода переменная вобще не играет!

 

Не могу раскладку украинскую сминить никакой комбинацией клавиш, а написана вопще русская!

 
Dimka-novitsek:

Там собствено есть ещё нималоважный параметр-тикет. Однако я его присваиваю переменной так int tacket=OrderSend и так int tucket=OrderSend,

а использую соотвецтвено так  OrderModify( tacket,      и короче формально я ошибки там как бы не вижу!!!


 Повидимому, ДЦ не принимает сразу с СЛ и ТП. После открытия модифицируйте СЛ и ТП. И 2ю позицию надо открывать не сразу, со следущим тиком!
 
Да, спасибо. Но там стоит  слип, и ну в общем открівает. Я попробую модифицировать отдельно, стоп, а ведь я и несу только стоп?
Причина обращения: