[АРХИВ]Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 5. - страница 403

 
solnce600:
а при помощи какой кнопки вы улыбаетесь или унываете ?

Этого Урри так и не узнал, да и мне неведома сия кнопочка самому, но хвостиком иногда виляем-с ... :)))
 
lottamer:

2 часа пытаюсь написать тестовый кусок, для дальнейшего тестирования разных условий. 

Не работает!

подскажите ошибку пожалуйста

 смысл чтобы ордера открывались по прошествии 2пп в свою сторону. 

открывается sell и с концами... 



Вроде, все логически верно!!   Только внимание- обьявлять все переменные надо выше старта, в том числе и ту, что у вас в скобках.
 
hoz:


 Мне интересно, зачем здесь условие?


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

Лучше вообще завершать start, если что-то не так, а не зацикливаться. На следующем тике повторять.

 
lottamer:

функция Кима имеет параметра время = "Дата и время в секундах с 1970 года"

я пробовал 2 варианта

и оба выдают профит не за текущий  день, а полный профит по всей истории....

Текущий день начинается с начала текущего D1 бара (iTime (NULL, PERIOD_D1, 0)), НО Вы же не ищите лёгких путей?! :)))
 
hoz:

 Я не совсем понимаю логики написания отдельной функции. Ведь функция RefreshRates() сама по себе служит для обновления данных предопределённых переменных. А Bid и Ask это, как раз-таки и есть предопределённые переменные.  Если функция RefreshRates() обновляет предопределённые переменные, то зачем писать какую-то дополнительную функцию?Можно пояснить?

Там есть особенность одна:

bool RefreshRates( )

Обновление данных в предопределенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт или скрипт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается TRUE, если данные обновлены, иначе FALSE. Данные могут не обновиться только по той причине, что они соответствуют текущему состоянию клиентского терминала. Эксперты и скрипты работают с собственной копией исторических данных. Копия данных по текущему инструменту создается при первоначальном запуске эксперта или скрипта. При каждом следующем запуске эксперта (напомним, что скрипт выполняется однократно и не зависит от приходящих тиков) первоначально созданная копия обновляется. За то время, пока эксперт или скрипт работает, может прийти один или несколько новых тиков, поэтому данные могут устареть.

 Обновляются данные тоже не сразу. Это надо контроллировать.

 
Zhunko:

Там есть особенность одна:

bool RefreshRates( )

Обновление данных в предопределенных переменных и массивах-таймсериях. Эта функция используется, когда эксперт или скрипт производит вычисления в течение долгого времени и нуждается в обновленных данных. Возвращается TRUE, если данные обновлены, иначе FALSE. Данные могут не обновиться только по той причине, что они соответствуют текущему состоянию клиентского терминала. Эксперты и скрипты работают с собственной копией исторических данных. Копия данных по текущему инструменту создается при первоначальном запуске эксперта или скрипта. При каждом следующем запуске эксперта (напомним, что скрипт выполняется однократно и не зависит от приходящих тиков) первоначально созданная копия обновляется. За то время, пока эксперт или скрипт работает, может прийти один или несколько новых тиков, поэтому данные могут устареть.

 Обновляются данные тоже не сразу. Это надо контроллировать.


Исходя из даной справки, возьмём цену АСК. Если запускаем RefreshRates() происходит обновление данных в массивах предопределённых переменных. Так вот, если цена АСК изменилась, то после запуска RefreshRates() АСК примёт новое значение. А если будет так: 

Данные могут не обновиться только по той причине, что они соответствуют текущему состоянию клиентского терминала. 

 тогда значение АСК не изменилось. Таким образом в вычисления будет использовано предыдущее значение АСКа, которое и было, т.к. оно не изменилось.

 Ведь всё-равно если функция RefreshRates() вернёт значение ТРУ, значит она успешно обновила данные, а значит не нужно контролировать её! Вы не согласны?

 
hoz:


Исходя из даной справки, возьмём цену АСК. Если запускаем RefreshRates() происходит обновление данных в массивах предопределённых переменных. Так вот, если цена АСК изменилась, то после запуска RefreshRates() АСК примёт новое значение. А если будет так: 

 тогда значение АСК не изменилось. Таким образом в вычисления будет использовано предыдущее значение АСКа, которое и было, т.к. оно не изменилось.

 Ведь всё-равно если функция RefreshRates() вернёт значение ТРУ, значит она успешно обновила данные, а значит не нужно контролировать её! Вы не согласны?

Нет. Она может вернуть FALSE, при этом данные будут свежие.

Данные могут не обновиться только по той причине, что они соответствуют текущему состоянию клиентского терминала.  

Надо найти для себя признак, по которому будешь считать, что данные свежие. Для разных задач он может быть разный.
 
Zhunko:

Нет. Она может вернуть FALSE, при этом данные будут свежие.

 Т.е. в документации явный косяк? И верить документации нельзя?

 

Zhunko:

Надо найти для себя признак, по которому будешь считать, что данные свежие. Для разных задач он может быть разный.

Допустим мы говорим о цене АСК. Имеем 2 переменные:

АСК - значение Ask после выполнения функции RefreshRates()

_АСК - значение Ask последнее известное.

_____________________________________________________________________________________ 

Ну сложно сказать. Признак то тут какой может быть. Есть 2 варианта:

1. Значение предопределённой переменной изменилось. RefreshRates() возвращает True.

2. Значение предопределённой переменной не изменилось. RefreshRates() возвращает False.

 

Если смотреть с другой стороны, по поводу найти признак. Есть 2 варианта:

1. Значение предопределённой переменной изменилось. Т.е. в нашем случае Ask = АСК

2. Значение предопределённой переменной не изменилось.  Т.е. Ask = _АСК

Есть либо изменённое значение, либо не изменённое, иного не дано. Как тогда по Вашему поступить? 

 
hoz:

 Т.е. в документации явный косяк? И верить документации нельзя?

 

Допустим мы говорим о цене АСК. Имеем 2 переменные:

АСК - значение Ask после выполнения функции RefreshRates()

_АСК - значение Ask последнее известное.

_____________________________________________________________________________________ 

Ну сложно сказать. Признак то тут какой может быть. Есть 2 варианта:

1. Значение предопределённой переменной изменилось. RefreshRates() возвращает True.

2. Значение предопределённой переменной не изменилось. RefreshRates() возвращает False.

 

Если смотреть с другой стороны, по поводу найти признак. Есть 2 варианта:

1. Значение предопределённой переменной изменилось. Т.е. в нашем случае Ask = АСК

2. Значение предопределённой переменной не изменилось.  Т.е. Ask = _АСК

Есть либо изменённое значение, либо не изменённое, иного не дано. Как тогда по Вашему поступить? 

В документации всё в порядке. Это, как раз описано и именно на это обратил Ваше внимание.

Возвращается TRUE, если данные обновлены, иначе FALSE. Данные могут не обновиться только по той причине, что они соответствуют текущему состоянию клиентского терминала.

Т.е. эта функция говорит, что поступили новые данные и только.

Остальное не знаю, как Вам надо. Я сверяю данные от сервера (MarketInfo()) с нулевым баром. Жду, когда они будут одинаковые. Кстати, это не гарантирует отсутствие "дыры" в ближайшей истории. Может запросто отсутствовать 1, 2 или 3 бар или несколько баров, а нулевой будет. Иногда они потом приходят. Иногда - нет.

 
Zhunko:

Т.е. эта функция говорит, что поступили новые данные и только.

Ну так если новые данные поступили, это то нам и нужно, разве не так?
Zhunko:

Я сверяю данные от сервера (MarketInfo()) с нулевым баром. Жду, когда они будут одинаковые. Кстати, это не гарантирует отсутствие "дыры" в ближайшей истории. Может запросто отсутствовать 1, 2 или 3 бар или несколько баров, а нулевой будет. Иногда они потом приходят. Иногда - нет.

Ну так да, на нужно данные с 0-го бара, есс-но. MarketInfo() с 0-го бара данные и тянет, не иначе. Зачем тогда их сверять с чем-н.?
Zhunko:

Кстати, это не гарантирует отсутствие "дыры" в ближайшей истории. Может запросто отсутствовать 1, 2 или 3 бар или несколько баров, а нулевой будет. Иногда они потом приходят. Иногда - нет.

Ну даже, если будет дыра в истории, то на текущих расчётах это никак не отразится. А отразилось бы в тот момент, когда была дыра. Т.е. если мы получает текущий Аск, то нам глубоко фиолетово какие цены были несколько баров назад (Я имею ввиду не формально, а касаемо именно текущего момента касательно определённой рыночной переменной, т.к. функция RefreshRates() себя касаемо текущего момента времени на 0-ом баре оправдает полностью!

 Я, конечно, капанул глубоко, но хочется понять как лучше себя вести.

 Вот Вы, Вадим, сказали, что я выше не верно написал функцию, продублирую ещё раз, с добавлеными строками:

double fGet_TradePrice(int fi_price,       // Цена: 0 - Bid; 1 - Ask
                       string fs_symbol)   // валютная пара
{
   double ld_price = 0.0;
   
   switch (fi_price)
   {
         case 0:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);
         
         case 1:
         if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Ask;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_ASK);
   }
   
    if (ld_price != 0)
        return (ld_price);
}

 

Что в ней не верного на Ваш взгляд? 

Причина обращения: