Подскажите как написать код (zig-zag) - страница 2

 
Sergey_n:
leonid553:

Посмотрел. Увы - не смогу ответить!


Поставьте Ваш вопрос - прямо там, - в ветке. И автор советника оперативно даст ответ!



А что такое Bar, это один пункт или тот бар который формируется на графике (bar=1 свечка)?
1 cвеча = 1 bar
 
пару вопросов появилось=) 1.) есть ли литература про виды трендов? допустим по длине. 2.)есть ли литература или закономерность, изменения поведения определенной вал. пары? Или период изменения 3,5,12 месяцев. 3.) Котировки при переносе позиции на другой день или на понедельник сильно скачут? 4.) Как можно сделать, чтобы в зависимосте от баланса изменялся лот, то есть 2*баланса(от начального депо) лот=2 и т.д. 5.) Как работает тайлинг стоп. 5.) Какие есть способы спасти убыточную позицию. С уважением Сергей
 
Sergey_n >>:
Здравствуйте.
Подскажите, как сделать так чтобы советник ждал, когда на индикаторе zig-zag образуется излом, то есть, допустим, максимум или минимум достигнуты и график пошел в другом направление, но излом не появился, как сделать чтобы после образования той висячей линии сигнализирующей что излом произошел, сразу например, сделать торговую операцию.
С уважение Сергей.


Может этот пример поможет


//+------------------------------------------------------------------+

//|                                  Schreibikus_ZizZag_1_4_0001.mq4 |

//|                                    Copyright © 2008 Роман Щуклин |

//|                               https://forextd.webasyst.net/shop/ |

//|                                                        ere@bk.ru |

//+------------------------------------------------------------------+

#property copyright "Copyright © 2008 Роман Щуклин"

#property link      "ere@bk.ru"

//#define  MAGIC1    140408

//#define  MAGIC2    240408

#include <stdlib.mqh>         // библиотека отображения ошибок


// Если в рынке есть ордер BUY то противоположный ордер SEL не открывается

// а стоп ордера BUY ставится на уровень отложки SEL +- 2 пункта

// безубыток по играющему ордеру выставляется 1 пункт + спред


//---- input parameters


extern int        ExtDepth=12;             //Значения ZigZag

extern int        ExtDeviation=5;         //Значения ZigZag

extern int        ExtBackstep=3;         //Значения ZigZag

extern int        ExtDlina = 70;        //Значения ZigZag

extern int        ExtTP = 50;          //Значения ТэйкПрофита

extern double     ExtTS = 15;         //Значения Трала

extern double     ExtLots=0.05;      //Первоначальный объем Лота

extern int        MAGIC1=111111;    //Магическе числоо для BUY

extern int        MAGIC2=222222;   //Магическе числоо для SELL


int               i,TP,TS,ticket; //Целые числа

double            zp,zc,zcn,zpn,PriceB1,PriceS1,UD,SL; //Дробные числа

//double SL=zc;


int start()

{

   bool        f;

   for(f=true,i=1;i<Bars;i++) //Проверка наличия свечей

   {

      zp=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i); //Расчет индикатора ZigZag

      if(zp>0) { if(f) { f=false; zc=zp; } else break; }

   }

   

   if((zp-zc)>=(ExtDlina/10000)) //Расчет растояния между точками последнего колена zp - верхняя точка zc - нижняя точка

   //Comment("Выполнили расчет длины колена "," zp-zc= ",zp-zc," >= "," Длина= ",ExtDlina);

   {                                            

      if(zp>zc)

      {                                      

         double w=zc+MathAbs((zp-zc)/4);

         PriceB1=NormalizeDouble(w,Digits); //расчет 1/4 длины BUY для определеления цены ордера

         //Comment("Расчитанная цена от длины колена PriceB1= ",PriceB1," w= ",w);

         

         if(PriceB1 > Ask) //Выставление отложенного ордера BUY

         {                          

            if(OrdersTotal()==0)

            {

               double TPNorm = NormalizeDouble(PriceB1+ExtTP*Point,Digits); // Нормализованный TakeProfit

               //Comment("Пробую выставить отложку по цене= ",PriceB1);

               ticket=OrderSend(Symbol(),OP_BUYSTOP,ExtLots,NormalizeDouble(PriceB1,Digits),9,zc,TPNorm,NULL,MAGIC1,0,Green); //Условие выставления ордера

               if(ticket<0) // ticket Уникальный порядковый номер ордера  

                 {Print("Oшибка: ",ErrorDescription(GetLastError())); 

                  Print("Текущ. цена= ",DoubleToStr((Bid),Digits));

                  Print("Цена установки BUY-ST= ", DoubleToStr(PriceB1,Digits));

                  Print("SL for BUY-ST= ", DoubleToStr(zc,Digits));

                  Print("TP for BUY-ST= ", DoubleToStr(TPNorm,Digits));

                 }

            }

            

            if(Bid <= zc) //Bid текущая цена изменения рынка zc нижняя расчетная точка

            {                                                             

               if (OrderSelect(ticket,SELECT_BY_TICKET)==true) // Выбор ордера для работы

               { //если есть ордер и цена текущая опустилась ниже стопа

               OrderDelete(OrderTicket()); //Удаление ордера

               //Comment("Удаляю ордер при Bid<=zc ",Bid," <= ",zc);

               }

               else Print("Oшибка удаления ордера ",ErrorDescription(GetLastError())); 

            }

            

         }else // иначе Ask (текущая цена) больше, чем PriceB1 (цена отложенного ордера)

         {


            if( (PriceB1 + Point * ExtTS) <= (Ask - Point * ExtTS) ) // условия модификации ордера

            {

               if (OrderSelect(ticket,SELECT_BY_TICKET)==true) // Выбор ордера для работы

               {

                  Comment("OrderOpenPrice = ",OrderOpenPrice(),"OrderStopLoss = ",OrderStopLoss());

                  if(Bid - OrderOpenPrice()>Point*ExtTS) //Следующее условие для модификации

                  {

                     if(OrderStopLoss()<Bid-Point*ExtTS) //Следующее условие для модификации

                     {

                        double SLNorm = NormalizeDouble(Bid-ExtTS*Point,Digits);

                        if(OrderModify(ticket,PriceB1,SLNorm,OrderTakeProfit(),0,Blue)==false) //Модификация ордера

                        {

                           Print("Не могу модифицировать ордер: ", ErrorDescription(GetLastError())); 

                           Print("Номер ордера= ",ticket);

                           Print("Цена открытия ордера= ", DoubleToStr(PriceB1,Digits));

                           Print("SL= ", DoubleToStr(SLNorm,Digits));

                           Print("TP= ", DoubleToStr(TPNorm,Digits));

                        }                        

                     }

                  }

               }

               /*

               double SLNorm = NormalizeDouble(Ask-ExtTS*Point,4);

               if(OrderModify(ticket,PriceB1,SLNorm,TPNorm,0,Blue)==false)

               {

                  Print("Не могу модифицировать ордер: ", ErrorDescription(GetLastError())); 

                  Print("Номер ордера= ",ticket);

                  Print("Цена открытия ордера= ", DoubleToStr(PriceB1,Digits));

                  Print("SL= ", DoubleToStr(SLNorm,Digits));

                  Print("TP= ", DoubleToStr(TPNorm,Digits));

               }

               */

            }

         }  

      }                                                          

   }                                                                    



               

  return(0);

}     

//+------------------------------------------------------------------+

 
Sergey_n писал(а) >>
Подскажите вот эта строчка

if (iCustom(NULL, 0, "ZUP_v49mod", minPercent, minSize, minBars, 0, 0)>0)

показывает, что если >0 то что? То есть, какое значение дает iCustom(NULL, 0, "ZUP_v49mod", minPercent, minSize, minBars, 0, 0) и что этим характеризует? Я как понял это проверка последнего бара, то есть если >0 то получен максимум? и какое он значение принимает, может быть в пунктах от максимума?

И за одно расскажите что делает этот код.
switch (filter)
{
case 1: ray_length=NormalizeDouble((peak2*minPercent/100), 4); break;
case 2: ray_length=minSize*Point; break;
}


С уважением Сергей

1. Индюк "ZUP_v49mod" возвращяет параметр нулевого буффера на нулевом барре. В зависимости от этого выполняется (если >0) или не выполняется (<0) условие if (iCustom(NULL, 0, "ZUP_v49mod", minPercent, minSize, minBars, 0, 0)>0)

2. Надо побольше кода. Откуда функция вызывается? Смахивает на размер лотта