У вас не стоит Flash Player
Настройки
#19396 - Mon Jan 10 2011 07:29 PM очень нужна помощь =(
big_cash Offline
stranger

Registered: Wed Sep 22 2010
Записи: 12
Доброго времени суток!

Когда еще торговал на метатрейдере (МТ4), пользовался одним индикатором, к которому очень привык.
Он похож на МАСД, но немного быстрее. Показывает направление движения.
Выглядит это примерно так:


В общем, есть код на МТ4, без коментариев и небольшой.
Но у меня затык в плане программирования. С# учить начал, но как показала практика, недостаточно понял, даже с примерами.

В общем, прошу помочь исправить код, или, возможно, если совсем не так все, то обяснить как правильно. С ним мучаюсь уже больше месяца, и не понимаю, в какую сторону уже копать. Уперся.

Код на МТ4
Code:
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 ForestGreen
#property indicator_color3 Red

extern int period = 25;
double ExtBuffer0[];
double ExtBuffer1[];
double ExtBuffer2[];

int init() {
   SetIndexStyle(0, DRAW_NONE);
   SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 2, ForestGreen);
   SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID, 2, Red);
   IndicatorDigits(Digits + 1);
   SetIndexBuffer(0, ExtBuffer0);
   SetIndexBuffer(1, ExtBuffer1);
   SetIndexBuffer(2, ExtBuffer2);
   IndicatorShortName("INDICATOR");
   SetIndexLabel(1, NULL);
   SetIndexLabel(2, NULL);
   return (0);
}

int start() {
   double current;
   double Pivot;
   double fut;
   int counted_bars = IndicatorCounted();
   double znach = 0;
   double per1 = 0;
   double per2 = 0;
   double LastLow = 0;
   double LastHigh = 0;
   if (counted_bars > 0) counted_bars--;
   int limit = Bars - counted_bars;
   for (int i = 0; i < limit; i++) {
      LastHigh = High[iHighest(NULL, 0, MODE_HIGH, period, i)];
      LastLow = Low[iLowest(NULL, 0, MODE_LOW, period, i)];
      Pivot = (High[i] + Low[i]) / 2.0;
      znach = 0.5 * ((Pivot - LastLow) / (LastHigh - LastLow) - 0.5) + 0.5 * per1;
      znach = MathMin(MathMax(znach, -0.999), 0.999);
      ExtBuffer0[i] = MathLog((znach + 1.0) / (1 - znach)) / 2.0 + per2 / 2.0;
      per1 = znach;
      per2 = ExtBuffer0[i];
   }
   bool up = TRUE;
   for (i = limit - 2; i >= 0; i--) {
      current = ExtBuffer0[i];
      fut = ExtBuffer1[i + 1];
      if ((current < 0.0 && fut > 0.0) || current < 0.0) up = FALSE;
      if ((current > 0.0 && fut < 0.0) || current > 0.0) up = TRUE;
      if (!up) {
         ExtBuffer2[i] = current;
         ExtBuffer1[i] = 0.0;
      } else {
         ExtBuffer1[i] = current;
         ExtBuffer2[i] = 0.0;
      }
   }
   return (0);
}


Код на с# в файле.
или
Code:
using System;
using System.Collections.Generic;
using TSLab.Script;
using TSLab.Script.Handlers;
using TSLab.Script.Optimization;
using TSLab.Script.Helpers;

namespace my_first_project.Properties
{

	public class Ind1 : IBar2DoubleHandler, IContextUses
	{
		[HandlerParameter(true, "5", Min = "1", Max = "20", Step = "1")]
		public int Period { get; set; }
		
	
		public IList<double> Execute(ISecurity source)
		{
		    var HH = Context.GetData("Highest", new[] { Period.ToString() },
		                               () => Series.Highest(source.HighPrices, Period));
		    var LL = Context.GetData("Lowest", new[] { Period.ToString() },
		                               () => Series.Lowest(source.LowPrices, Period));
		    var C = source.ClosePrices;
		  
		    IList<double> Ind = new List<double>(C.Count);
		    IList<double> Ind1 = new List<double>(C.Count);
		    
		    double per1 = 0;
		    double per2 = 0;		   
		    				    	
		    for (int i = 0; i < C.Count; i++)
		    {
		    	var znach = 0.5 * ((((HH[i]+LL[i]) / 2) - LL[i]) / (HH[i]-LL[i]) - 0.5) + 0.5 * per1;
		    	znach = Math.Min(Math.Max(znach, -0.999), 0.999);
		    	var buf = Math.Log((znach + 1.0) / (1 - znach)) / 2.0 + per2 / 2.0;
		    	per1 = znach;
		    	per2 = buf;
		    }
			
		    double buf2 = 0;
		    double buf1 = 0;
		    double cur = 0;
		    double fut = 0;
		    double itog = 0;
		   
		    bool up = true;
		    for (int i = C.Count - 2; i >=0; i--)
		    {
		    	cur = buf[i];
		    	fut = buf[i+1];
		    	
		    	if ((cur < 0 && fut > 0) || cur < 0) up = false;
		    	if ((cur > 0 && fut < 0) || cur > 0) up = true;
		    	if (!up)
		    	{
		    		buf2 = cur;
		    		buf1 = 0;		    		
		    	} 
		    	  	else
		    	{
		    		buf1 = cur;
		    		buf2 = 0;
		    	}
		    	
		    	Ind.Add(buf1);
		    	Ind1.Add(buf2);
		    }
		    return Ind1;
		}
	public IContext Context { get; set; }
	}
		
}


Attachments
indicatot MT4.png (616 downloads)
INDICATOR.cs (108 downloads)



Отредактировано big_cash (Mon Jan 10 2011 07:34 PM)

Наверх
#19397 - Mon Jan 10 2011 07:32 PM Re: очень нужна помощь =( [Re: big_cash]
big_cash Offline
stranger

Registered: Wed Sep 22 2010
Записи: 12
Особенно непонятно, как выводить 2 переменные на выходе. Хотя может я вообще не правильно код написал.

Наверх
#19402 - Mon Jan 10 2011 11:57 PM Re: очень нужна помощь =( [Re: big_cash]
serg Offline
Pooh-Bah

Registered: Fri May 14 2010
Записи: 1663
Loc: Россия
а если сравнить с MACD ? графически,для ясности ( на том же инструменте и на том же фрейме и типа ЕМА вывести - для ориентира)))

Наверх
#19406 - Tue Jan 11 2011 01:14 AM Re: очень нужна помощь =( [Re: serg]
big_cash Offline
stranger

Registered: Wed Sep 22 2010
Записи: 12
Originally Posted By: serg
а если сравнить с MACD ? графически,для ясности ( на том же инструменте и на том же фрейме и типа ЕМА вывести - для ориентира)))


Они похожи, но, к сожалению, не сопоставимы. На верхнем графике, был MACD, просто плохо наверное видно..





Attachments
example.png (548 downloads)



Отредактировано big_cash (Tue Jan 11 2011 01:16 AM)

Наверх


Moderator:  ViL, sar