Страница 1 из 1

Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 16:35
tormovies
скрипт простой
пытаюсь ограничить уведомления одним разом на одной свече, для чего запоминаю к примеру индекс сигнальной свечи, потом сравниваю и запоминаю если надо новый
проверяю был ли сигнал там или нет
ии увы глобальная переменная то равна индексу то равна нулю, хотя к нулю я её только раз привожу при старте
при каждом тике сначала LastBarAlert = 0 потом приравнивается к MaxIndex и так по кругу, как сделать чтоб она уже запомнила индекс

Код: Выделить всё

function Initialize()
{
   IndicatorName = "test";
   PriceStudy = true;
   AddInput("Input", Inputs.Candle);
   AddSeries("BuyA", DrawAs.Custom, Color.Blue);
   AddSeries("SellA", DrawAs.Custom, Color.Red);
   AddGlobalVariable("LastBarAlert", Types.Int, 0);
   AddParameter("Alert", 1);
}

function Evaluate()
{
   int i = 0;
   if(Alert>0 && CurrentIndex >=(MaxIndex-1) && LastBarAlert<MaxIndex){
      //LastTime = BarTime();
      ShowMessage("Сигнал на Покупку 1 "+LastBarAlert+"  "+MaxIndex+"  "+BarTime());
      LastBarAlert = MaxIndex;
      ShowMessage("Сигнал на Продажу 2 "+LastBarAlert+"  "+MaxIndex+"  "+BarTime());
      //PlaySound(InnerSystemSounds.Asterisk);
   }
}

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 17:34
evge
Индикатор при перерисовке заново производит инициализацию, между перерисовками глоб переменные не сохраняются.
Т.е. это лишь глоб переменная на одну полную отрисовку индикатора.

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 17:58
tormovies
evge писал(а):Индикатор при перерисовке заново производит инициализацию, между перерисовками глоб переменные не сохраняются.
Т.е. это лишь глоб переменная на одну полную отрисовку индикатора.

В смысле ))) а как тогда что то запоминать в файл что ли ?

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 18:01
evge
в том смысле, что рисуется индикатор по истории слева-направо до последнего видимого бара
и пока он рисуется можно менять глоб переменные и считывать их в процессе.
Как только индикатор отрисовался полностью, цикл заканчивается, а новый цикл будет уже с заново инициализированными глоб. переменными.

Ну да, можно в файл, как вариант :)

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 18:25
tormovies
evge писал(а):в том смысле, что рисуется индикатор по истории слева-направо до последнего видимого бара
и пока он рисуется можно менять глоб переменные и считывать их в процессе.
Как только индикатор отрисовался полностью, цикл заканчивается, а новый цикл будет уже с заново инициализированными глоб. переменными.

Ну да, можно в файл, как вариант :)

индикатор полностью пересчитывается каждый раз ? или хоть ))) только последние бары ?
ну просто это как бы не совсем экономично столько обсчитывать каждый тик

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 19:17
evge
Каждый тик, логично и скорее всего разработчики АД4 так и сделали, обсчитывается только для последнего бара. Это можно проверить, записывая в лог файл данные.

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 19:25
evge
Надо не забывать, что индикаторы рисуют и "задним числом" и перерисовка, возможно, необходимость!

Проверил, при каждом тике полностью перерисовывается:

вот скрипт индикатора простейший, пишущий в лог

Код: Выделить всё

function Initialize()
{
   IndicatorName = "test";   
   PriceStudy = false;   
   AddInput("Input", Inputs.Price);   
   AddSeries("A", DrawAs.Line, Color.Red);   
}

function Evaluate()
{
   LogData(String.Format(" {0} : {1} : {2}", BarDate(), BarTime(), Input[0]), IndicatorName);
}

вот в логе обновляет (дополняет) постоянно информацию, где видно что информация не только по последнему бару заполняется при каждом тике

(график я НЕ двигал в это время, только изменялась цена и индикатор писал в лог)

2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 15:00:00 : 61,48
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 16:00:00 : 61,51
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 17:00:00 : 61,56
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 18:00:00 : 61,58
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 19:00:00 : 61,88
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 20:00:00 : 61,97
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 21:00:00 : 61,85
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 22:00:00 : 61,84
2017.11.16 20:10:09.626 15.11.2017 0:00:00 : 23:00:00 : 61,81
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 10:00:00 : 62,14
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 11:00:00 : 61,93
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 12:00:00 : 61,72
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 13:00:00 : 61,76
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 14:00:00 : 61,62
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 15:00:00 : 61,46
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 16:00:00 : 61,54
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 17:00:00 : 61,45
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 18:00:00 : 61,8
2017.11.16 20:10:09.626 16.11.2017 0:00:00 : 19:00:00 : 61,98

Наверное, это не оптимально, т.к. можно было бы просто отрисовывать серии не пересчитывая их заново. Возможно есть какие-то нюансы, которые нам не очевидны, разработчикам виднее.

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 16 ноя 2017, 20:26
tormovies
по мне так не продумано ))) по мне так в метатрейдере вполне нормально обсчет сделан - то что просчитано не пересчитывается без команды, можно к примеру пересчитывать сделать последние 2-3 бара . я еще думаю что так график тормозит когда два включил
но этот вопрос уже не вам,
благодарю за помощь ))))
разработчикам бы документацию сделать нормальную

Re: Теряется глобальная переменная, не понимаю ))

Добавлено: 20 ноя 2017, 12:30
tormovies
Благодарю evge , с помощью соседней ветки смог вроде сделать запоминание сигнала в текстовый файл , правда по моему пока еще подглючивает, как то умудрился выдать предыдущий сигнал после пересчета, но уже что то
конечно не хватает внятных Алертов, чтоб так "Бросай всё ))) сигнал поступил", ну просто значит робота делать надо
Пример кода

Код: Выделить всё

function Initialize()
{
   IndicatorName = "test";
   PriceStudy = true;
   AddInput("Input", Inputs.Candle);
   AddSeries("Buy");
   AddSeries("Sell");
   AddSeries("BuyA", DrawAs.Custom, Color.Blue);
   AddSeries("SellA", DrawAs.Custom, Color.Red);
   AddSeries("H");
   AddSeries("L");
   AddParameter("DataSlot", 0);
   AddParameter("Alert", 1);
}

function Evaluate()
{
    if (DataSlot == 0) return;
    string Path = @"DataSlot" + (int)DataSlot + "\\";
    System.IO.DirectoryInfo dirInfo = new System.IO.DirectoryInfo(Path);
    if (!dirInfo.Exists) dirInfo.Create();
    string FileName = String.Format("{0}-{1}-{2}-{3}-{4}-{5}",
    BarDate().Year, BarDate().Month, BarDate().Day, BarTime().Hours, BarTime().Minutes, BarTime().Seconds);
    string URL = Path + FileName;


   .......
   
   if(Buy[0]==1 && Sell[-1]==1){// тренд сменился
         BuyA = Input.Low[0];
         BuyA.DrawFigure(Figure.Up,Color.Blue,Line.Solid,5,Color.Orange,0);
         if(Alert>0 && CurrentIndex == MaxIndex && !System.IO.File.Exists(URL)){
            ClearFile(URL);
            WriteLine(URL, String.Format("{0};{1};{2};{3};{4};{5};{6};{7};BUY",  Input.Open[0], Input.High[0], Input.Low[0], Input.Close[0], Input.Volume[0], Input.VolumeBid[0], Input.VolumeAsk[0], Input.OpenInterest[0]));
            ShowMessage("Сигнал на BUY   "+MaxIndex+"  "+BarTime());
            PlaySound(InnerSystemSounds.Beep);
         }
   }
   if(Sell[0]==1 && Buy[-1]==1){// тренд сменился
         SellA = Input.High[0];
         SellA.DrawFigure(Figure.Down,Color.Red,Line.Solid,5,Color.Orange,0);
         if(Alert>0 && CurrentIndex ==MaxIndex && !System.IO.File.Exists(URL)){
            ClearFile(URL);
            WriteLine(URL, String.Format("{0};{1};{2};{3};{4};{5};{6};{7};SELL",  Input.Open[0], Input.High[0], Input.Low[0], Input.Close[0], Input.Volume[0], Input.VolumeBid[0], Input.VolumeAsk[0], Input.OpenInterest[0]));
            ShowMessage("Сигнал на Sell   "+MaxIndex+"  "+BarTime());
            PlaySound(InnerSystemSounds.Asterisk);
         }
   }
}