#19396 - Mon Jan 10 2011 07:29 PM
очень нужна помощь =(
|
stranger
Registered: Wed Sep 22 2010
Записи: 12
|
Доброго времени суток! Когда еще торговал на метатрейдере (МТ4), пользовался одним индикатором, к которому очень привык. Он похож на МАСД, но немного быстрее. Показывает направление движения. Выглядит это примерно так: В общем, есть код на МТ4, без коментариев и небольшой. Но у меня затык в плане программирования. С# учить начал, но как показала практика, недостаточно понял, даже с примерами. В общем, прошу помочь исправить код, или, возможно, если совсем не так все, то обяснить как правильно. С ним мучаюсь уже больше месяца, и не понимаю, в какую сторону уже копать. Уперся. Код на МТ4
#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);
}
Код на с# в файле. или 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]
|
stranger
Registered: Wed Sep 22 2010
Записи: 12
|
Особенно непонятно, как выводить 2 переменные на выходе. Хотя может я вообще не правильно код написал.
|
|
Наверх
|
|
|
|
#19402 - Mon Jan 10 2011 11:57 PM
Re: очень нужна помощь =(
[Re: big_cash]
|
Pooh-Bah
Registered: Fri May 14 2010
Записи: 1663
Loc: Россия
|
а если сравнить с MACD ? графически,для ясности ( на том же инструменте и на том же фрейме и типа ЕМА вывести - для ориентира)))
|
|
Наверх
|
|
|
|
#19406 - Tue Jan 11 2011 01:14 AM
Re: очень нужна помощь =(
[Re: serg]
|
stranger
Registered: Wed Sep 22 2010
Записи: 12
|
а если сравнить с MACD ? графически,для ясности ( на том же инструменте и на том же фрейме и типа ЕМА вывести - для ориентира))) Они похожи, но, к сожалению, не сопоставимы. На верхнем графике, был MACD, просто плохо наверное видно..
Attachments
example.png (548 downloads)
Отредактировано big_cash (Tue Jan 11 2011 01:16 AM)
|
|
Наверх
|
|
|
|
|
|