Общие вопросы по разработке > Теряется глобальная переменная, не понимаю ))

Общие вопросы по разработке в Альфа-Директ 4. Обсуждение разработки пользовательских индикаторов, стратегий.
tormovies
Сообщения: 6
Зарегистрирован: 18 июн 2016, 18:59
Благодарил (а): 2 раза

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

Непрочитанное сообщение tormovies » 16 ноя 2017, 16:35

скрипт простой
пытаюсь ограничить уведомления одним разом на одной свече, для чего запоминаю к примеру индекс сигнальной свечи, потом сравниваю и запоминаю если надо новый
проверяю был ли сигнал там или нет
ии увы глобальная переменная то равна индексу то равна нулю, хотя к нулю я её только раз привожу при старте
при каждом тике сначала 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);
   }
}

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

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

Непрочитанное сообщение evge » 16 ноя 2017, 17:34

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

tormovies
Сообщения: 6
Зарегистрирован: 18 июн 2016, 18:59
Благодарил (а): 2 раза

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

Непрочитанное сообщение tormovies » 16 ноя 2017, 17:58

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

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

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

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

Непрочитанное сообщение evge » 16 ноя 2017, 18:01

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

Ну да, можно в файл, как вариант :)
никогда такого не было и вот опять

tormovies
Сообщения: 6
Зарегистрирован: 18 июн 2016, 18:59
Благодарил (а): 2 раза

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

Непрочитанное сообщение tormovies » 16 ноя 2017, 18:25

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

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

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

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

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

Непрочитанное сообщение evge » 16 ноя 2017, 19:17

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

Аватара пользователя
evge
Администратор
Сообщения: 1811
Зарегистрирован: 04 фев 2016, 09:46
Откуда: Млечный путь, планета Земля
Благодарил (а): 83 раза
Поблагодарили: 366 раз
Контактная информация:

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

Непрочитанное сообщение evge » 16 ноя 2017, 19:25

Надо не забывать, что индикаторы рисуют и "задним числом" и перерисовка, возможно, необходимость!

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

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

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

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

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

tormovies
Сообщения: 6
Зарегистрирован: 18 июн 2016, 18:59
Благодарил (а): 2 раза

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

Непрочитанное сообщение tormovies » 16 ноя 2017, 20:26

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

tormovies
Сообщения: 6
Зарегистрирован: 18 июн 2016, 18:59
Благодарил (а): 2 раза

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

Непрочитанное сообщение tormovies » 20 ноя 2017, 12:30

Благодарю 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);
         }
   }
}



Вернуться в «Общие вопросы по разработке»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 9 гостей