Владимир писал(а):Закомментировал не получается только на графике результат поменялся. всего скорей в массив данные нулевые попадают
У меня исправленная стратегия + индикатор с комментарием выдавала 3 сделки на 2000 барах.
Владимир писал(а):Закомментировал не получается только на графике результат поменялся. всего скорей в массив данные нулевые попадают
Владимир писал(а):Добрый день! А на каком инструменте и таймфрейме?
Код: Выделить всё
   AddInput("Input1", Inputs.Candle, 5, true, "RIH7=ФОРТС");Код: Выделить всё
/**
Открытие позиции происходит по изгзагу
Developed by Владимир;
Algorithm = ТРЕНД;
Hash code 6504115CF5A6D848004B9BFB42169CE8
**/
function Initialize()
{
   StrategyName = "IndTrenda";
   AddParameter("PowerTrenda", 5, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "RIH7=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
   AddChartIndicator("MY.WolfeWave", new Dictionary <string, double>{{"Scan", 326},{"NRepetition", 1}});
}
function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (MY.WolfeWave(Input1, 326, 1).GetValue("NaprTrenda", 0) == 1) )
   {
      EnterLong();
      StopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
   }
   /// ПРАВИЛО 2
   if ( (MY.WolfeWave(Input1, 326, 1).GetValue("NaprTrenda", 0) == 2) )
   {
      EnterShort();
      StopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
   }
}
Код: Выделить всё
function Initialize()
{
// Область определения параметров индикатора
// Обязательные параметры:
   IndicatorName = "WolfeWave";   // Задайте название индикатора и сохраните с данным именем
   PriceStudy = true;   // Рисовать в области цены (true – да, false – нет)
   AddInput("Input", Inputs.Candle);   // Input - входной ряд (Inputs.Price) или свечи (Inputs.Candle)
   AddSeries("LineHigh", DrawAs.Custom, Color.Green);      // Задаем вид линии индикатора с именем LineHigh
   AddSeries("LineLow", DrawAs.Custom, Color.Red);         // Задаем вид линии индикатора с именем LineLow 
   AddSeries("MarkerUp", DrawAs.Custom, Color.Red);         // Метим экстремум
   AddSeries("MarkerLow", DrawAs.Custom, Color.Yellow);      // Метим экстремум
  AddSeries("ChHigh", DrawAs.Custom, Color.Red, true, Axes.Parent);   //Рисуем канал внешней свечки для выделения внутренних свечей
  AddSeries("ChLow", DrawAs.Custom, Color.Red, true, Axes.Parent);   //ChHigh- верхняя линия, ChLow- нижняя линия канала
// Дополнительные параметры:
 AddParameter("Scan", 326, 1);      // Сканируемый период
 //AddParameter("имя переменной", период, множитель),  требующий размер истории 163 баров ( т.е. 163*1)
 AddParameter("NRepetition", 2);   // Колличество повторений тренда 
 //AddParameter("NTeste", 2);         // Колличество повторных входов
 // Вывод данных
 AddSeries("PointInput");   // Выводим значение предпологаемой переменной цены покупки (переменная для робота) 
 AddSeries("NaprTrenda");      // Направление движения цены 0- нет; 1-лонг; 2-шорт;  (переменная для робота)
 AddSeries("PowerTrenda");      // Сила тренда, коррекция
 AddSeries("StopExst");      //Значение экстремума для выставления стопа (либо рассчетный или экстремум, что оптимальней?)
 //пробуем хранить данные в глобальных переменных
 //AddGlobalVariable("NaprTrendaGlobalVariable", Types.Int, 0); 
// AddGlobalVariable("PowerTrendaGlobalVariable", Types.Int, 0); 
// AddGlobalVariable("High0GlobalVariable", Types.Double, 0.0); 
// AddGlobalVariable("High1GlobalVariable", Types.Double, 0.0); 
// AddGlobalVariable("Low0GlobalVariable", Types.Double, 0.0); 
// AddGlobalVariable("Low1GlobalVariable", Types.Double, 0.0); 
 
}
function Evaluate()
{ 
    int IzNapr=0;      // Изменение направления  0- нет; 1-лонг; 2-шорт;
    int NaprHelp=1;      // Вспомогательный маркер изменения направления
    int Xx=Scan-1;      // переменная сравнения номер свечи
    int XHighN=Scan-1;   // Переменная хранения номера свечи хая для сравнения
    int XLowN=Scan-1;   // Переменная хранения номера свечи лоу для сравнения
    int XhiPostr=0;      // Переменная начало данных в массиве для обработки и построения хай
    int XloPostr=0;      // Переменная начало данных в массиве для обработки и построения лоу
int ExstremaNumber = (int)(Scan/5);  //Задаём колличество экстремумов
double [] Buf_High = new double[ExstremaNumber];   // Объявление массивов цен (под буферы индикатора)
double [] Buf_Low = new double[ExstremaNumber];      // Объявление массивов цен (под буферы индикатора)
int [] Buf_time_High = new int[ExstremaNumber];      // Объявление массивов время цены (под буферы индикатора)
int [] Buf_time_Low = new int[ExstremaNumber];      // Объявление массивов время цены (под буферы индикатора)
   if ((MaxIndex - CurrentIndex) > Scan) return;
   {
 //   if (CurrentIndex == MaxIndex)
{
    double HighX= Input.High[Scan];      // Переменная хранения значения хая для сравнения
    double LowX=Input.Low[Scan];      // Переменная хранения значения лоу для сравнения
    double High = Input.High[Scan];      // Переменная сравнения хая
    double Low = Input.Low[Scan];      // Переменная сравнения лоу
      
  for (var x= Scan-1; x>0; x--) 
   {
 ///// При нормальных свечах
     if (Input.Open[x]<Input.Close[x]) // Проверяем закрытие свечи лонг шорт
        {// Лонг
          if (High<Input.Close[x])
          {   // Считаем, что произошло обновление High. Поэтому переписываея значения хая и лоу
          IzNapr=1;   //лонг
          High=Input.High[x];
          Low=Input.Low[x];
         Xx=x;      // Сохраняем значение для построения канала
          HighX=High;   // Сохраняем значение хая в памяти
          XHighN=x;      // Сохраняем значение в памяти
          }
      }
      else
          {// Шорт
           if (Low>Input.Close[x])
            { // Считаем, что произошло обновление low. Поэтому переписываея значения хая и лоу
             IzNapr=2;  //шорт
             High=Input.High[x];
             Low=Input.Low[x];
           Xx=x;      // Сохраняем значение для построения канала
             LowX=Low;   // Сохраняем значение лоу в памяти
             XLowN=x;   // Сохраняем значение в памяти
            }
           }
 ///// При формировании свечей с гепами
     if (Input.Open[x]>Input.Close[x]) //Проверяем закрытие свечи лонг шорт
        {// Лонг
          if (High<Input.Open[x])
          {   // Считаем, что произошло обновление High. Поэтому переписываея значения хая и лоу
          IzNapr=1;   //лонг
          High=Input.High[x];
          Low=Input.Low[x];
           Xx=x;      //Сохраняем значение для построения канала
          HighX=High;   //Сохраняем значение хая в памяти
          XHighN=x;      //Сохраняем значение в памяти
          }
      }
      else
          {// Шорт
           if (Low>Input.Open[x])
            { // Считаем, что произошло обновление low. Поэтому переписываея значения хая и лоу
             IzNapr=2;  //шорт
             High=Input.High[x];
             Low=Input.Low[x];
             Xx=x;      //Сохраняем значение для построения канала
              LowX=Low;   //Сохраняем значение лоу в памяти
              XLowN=x;   //Сохраняем значение в памяти
              }
           }
    // Заполняем буфер хаёв
            if (IzNapr==NaprHelp && IzNapr==2 && HighX>0)    // Смена направления с лонга в шорт
            {
              for (var ch=ExstremaNumber-1; ch>0; ch--) 
              {
               Buf_High[ch]=Buf_High[ch-1];
               Buf_time_High[ch]=Buf_time_High[ch-1];
               }
              Buf_High[0]=HighX;
              Buf_time_High[0]=XHighN;
              NaprHelp=1;
             }
   // Заполняем буфер лоёв
            if (IzNapr==NaprHelp && IzNapr==1 && XLowN>0)    // Смена направления с шорта в лонг
            {
              for (var Lo=ExstremaNumber-1; Lo>0; Lo--)  
              {
               Buf_Low[Lo]=Buf_Low[Lo-1];
                Buf_time_Low[Lo]=Buf_time_Low[Lo-1];
               }
              Buf_Low[0]=LowX;
              Buf_time_Low[0]=XLowN;
              NaprHelp=2;
             }
// Строим канал внешней свечи, для выделения внутренних свечей
  ChLow[Xx]= Low;
  ChLow[0]= Low;
  ChHigh[Xx]= High;
  ChHigh[0]= High;
ChLow.DrawChannel(ChHigh);
////////
   } // Закрытие цикла for
      //////// Ищем в массивах начало данных для обработки
        for(var a=ExstremaNumber-1; a>0; a--)
           {
           if (Buf_Low[a]>0 &&  XloPostr==0)
            {XloPostr= a;}
            if (Buf_High[a]>0 &&  XhiPostr==0)
           { XhiPostr= a;}
           }
     //////// Задаём данные для построения меток на графике  MarkerUp.DrawArrowDown(),MarkerLow.DrawArrowUp()
           for (var b=0; b<XloPostr+1; b++)
           { //if (Buf_Low[b]>0)
             MarkerLow[Buf_time_Low[b]]=Buf_Low[b];
           }      // Данные для построения меток хаёв
           for (var c=0; c<XhiPostr+1; c++)
           {
            //if(Buf_High[c]>0)
            MarkerUp[Buf_time_High[c]]=Buf_High[c];
           }   // Данные для построения меток лоёв
   ///////// Линия тренда        
         for(var i=0; i<ExstremaNumber-1; i++)
           {
         if ( Buf_Low[i]>0 &&  Buf_High[i]>0)
              {
            LineHigh[Buf_time_Low[i]]=Buf_Low[i];
            LineHigh[Buf_time_High[i]]=Buf_High[i];
              }
            }
   ///// Построение временной линии - предварительные хай и лоу!!!!!!!!
         if (IzNapr==1)// Задаём данные на построение предварительной вершины
         {LineLow[Buf_time_Low[0]]=Buf_Low[0];
          LineLow[Xx]=High;
         }
         if (IzNapr==2)// Задаём данные на построение предварительной впадины
         {LineLow[Buf_time_High[0]]=Buf_High[0];
          LineLow[Xx]=Low;
         }
 // Данные графика заданы
   }// Скобка (CurrentIndex == MaxIndex)
} // Скобка if ((MaxIndex - CurrentIndex) > Scan) return;
/////////////////////////////////
 
 //1 Сравниваем последние значения цены, колличество сравнений заданно переменной "NRepetition", определяем направление тренд переменная "NaprTrenda"
 //2 Определим последнее значение хай или лоу, поределяем силу тренда "PowerTrenda"
 //3 По данным направления и силе тренда - определяем точку входа (цена входа).
 //3.1 Смена направления в сторону тренда (данная свеча неявляется внутренней)
 //3.2 Процент коррекции составляет неболее %, задаём в переменной "CorrectionPercentage"
 //3.3 Значение экстремума для выставления стопа (либо рассчетный или экстремум, что оптимальней выставляем в //роботе) переменная "StopExst"
    NaprTrenda=0; //первоначальный сброс значения тренда
   int Repetition = (int)(NRepetition);
    if (Repetition>1)// Обязательная проверка, число повторов тренда больше 1 иначе воизбежании ошибки записываем 1
      { //NaprTrenda=0; //первоначальный сброс значения тренда
             var RepetitionHigh=0;
            var RepetitionLow=0;
            for (var i=Repetition; i>0; i--)
          {
            if ((Buf_High[i-1]>Buf_High[i]) && (Buf_Low[i-1]>Buf_Low[i]))
                {RepetitionHigh++;
               if (RepetitionHigh==Repetition)
               {NaprTrenda=1;}}
            if ((Buf_High[i-1]<Buf_High[i]) && (Buf_Low[i-1]<Buf_Low[i]))
                {RepetitionLow++;
               if (RepetitionLow==Repetition)
               {NaprTrenda=2;}}
          }
      }
      else
      { Repetition=1;}
 
   if (Buf_time_Low[0]>Buf_time_High[0])
   {   //последний хай //PowerTrenda
      if (NaprTrenda==2)
      {
      PowerTrenda=(1-((Buf_High[0]-Buf_Low[0])/(Buf_High[1]-Buf_Low[0])))*100;
      StopExst=Buf_High[0];
      }
   }
   else
   {   //последний лоу
       if (NaprTrenda==1)
      {
      PowerTrenda=(1-((Buf_High[0]-Buf_Low[0])/(Buf_High[0]-Buf_Low[1])))*100;
      StopExst=Buf_Low[0];
      }
   }
 ///////////////////////////////
// Выводим данные на график
MarkerUp.DrawArrowDown();
MarkerLow.DrawArrowUp();
LineHigh.DrawLine(Color.Green, Line.Solid, 2); 
LineLow.DrawLine(Color.Red, Line.Solid, 2);
}
Код: Выделить всё
 //   if (CurrentIndex == MaxIndex)Код: Выделить всё
/**
Открытие позиции происходит по изгзагу
Developed by Владимир;
Algorithm = ТРЕНД;
Hash code C5EED5CD61D05F06DDE42A62A31EE3DA
**/
function Initialize()
{
   StrategyName = "IndTrenda";
   AddParameter("PowerTrenda", 5, "", 1);
   AddInput("Input1", Inputs.Candle, 5, true, "RIH7=ФОРТС");
   LongLimit = 1;
   ShortLimit = -1;
   AddChartIndicator("MY.WolfeWave", new Dictionary <string, double>{{"Scan", 326},{"NRepetition", 1}});
}
function OnUpdate()
{
   /// ПРАВИЛО 1
   if ( (MY.WolfeWave(Input1, 326, 1).GetValue("NaprTrenda", 0) == 1) && (MY.WolfeWave(Input1, 326, 2).GetValue("PowerTrenda", 0) >= PowerTrenda) )
   {
      EnterLong();
      StopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
   }
   /// ПРАВИЛО 2
   if ( (MY.WolfeWave(Input1, 326, 2).GetValue("NaprTrenda", 0) == 2) && (MY.WolfeWave(Input1, 326, 2).GetValue("PowerTrenda", 0) >= PowerTrenda) )
   {
      EnterShort();
      StopLoss(0.1, SignalPriceType.DeltaInPercentFromAveragePrice);
   }
}
Код: Выделить всё
AddChartIndicator("MY.WolfeWave", new Dictionary <string, double>{{"Scan", 326},{"NRepetition", 1}});
Код: Выделить всё
LogData ("NaprTrenda - " + Convert.ToString(NaprTrenda) + "PowerTrenda - " + Convert.ToString(PowerTrenda) + "// StopExst - " + Convert.ToString(StopExst) , IndicatorName);2017.02.15 10:15:05.483 NaprTrenda=2
2017.02.15 10:15:05.483 NaprTrenda - 2PowerTrenda - 1,67652859960579// StopExst - 2151,6
2017.02.15 10:19:59.673 NaprTrenda=2
2017.02.15 10:19:59.673 NaprTrenda - 2PowerTrenda - 1,67652859960579// StopExst - 2151,6
2017.02.15 11:24:59.670 NaprTrenda=2
Владимир писал(а): 1. Вопрос какими методами можно открыть позицию в любое время?
Владимир писал(а): 2. Работает ли эта функция и как? (UseClosedBar=false; //разрешение на открывание позиции внутри бара)
Вернуться в «Общие вопросы по разработке»
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 21 гость