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

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

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

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

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

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); // Некорректно! Что функция будет возвращать, если цена равна нулю?
}

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

1. Если данные не поступили, и при этом все данные есть, но мы об этом ничего не знаем? Вернёт FALSE. Как это расценивать? Отсутствие данных или ошибка, или, всё же, данные есть?
2. Сверять надо чтобы решить проблему 1-го пункта.
3. Динамику процесса не учитываете. Включили комп, терминал. Пришли, как кажется все данные. Всё сошлось на нулевом баре. Сигналы найдены. Сделка совершена. Оказывается данные пришли не все. Через 5 минут пришли недостающие бары с номерами 1,2,3,4,5. Сигнал исчез. Что делать?

4. Красным отметил. Ещё не обрабатывается возможная ошибка выбора неверного идентификатора в переключателе. Выше написал, как надо.

Бесполезно вызывать RefreshRates() без ожидания результата. Он может долго не свершиться. 

 
 Здравствуйте всем. У меня такой вопрос. Так как торгую на нескольких счетах (два в одном ДЦ и один в другом), то пользуюсь копировальщиком Best copier, очень удобно. Он устанавливается на один счет (экспортер) на любой график и копирует на другие счета (импортеры), где сей советник устанавливается тоже на одном графике (если его поставить, в импортере, на несколько графиков, то он будет открывать столько же ордеров). Однажды, когда я хотел проверить работу с его помощью на одном из ДЦ и установил демо счет), в один прекрастный момент самопроизвольно установился на нескольких графиках и естественно открыл столько же ордеров. Тогда я не придал этому значения, подумав, что этого глюк терминала данного ДЦ. После этого торговал продолжительное время на вышеуказанных счетах и ничего подобного не происходило. Но вчера, как раз в период выхода новостей, повторилась подобная ситуация на одном из счетов (счет другого ДЦ, не того на котором установлен экспортер) - на 6-ти графиках установились самопроизвольно советники, но самое интересное, что по одной паре открылось 16 ордеров. Почему такое происходит и в чем причина? Это недостаток самого советника или другая причина? Можно ли как-то это исправить? За раннее благодарен.
 
// Зачем этот тормоз без обработки возвращаемого значения?

Кто задает такой вопрос? 
 
hoz:
 

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


Она не неправильная, она просто мутноватая. 

Концовочка:

 if (ld_price != 0)
return (ld_price); 
 

Если ld_price = 0, то функция вернет 0 сама по себе. Поэтому не нужна проверка. 

Вот это разруливание: 

 if (fs_symbol == Symbol())
         {
             RefreshRates();
             ld_price = Bid;
         }
         else
             ld_price = MarketInfo(fs_symbol, MODE_BID);

Тоже не нужно. Можно во всех случаях использовать MraketInfo(). 

В конце концов функция превращается в функцию MarketInfo() в чистом виде (если убрать все лишнее). 

 

В принципе, теоретически, вот эти места правильные:

RefreshRates();
ld_price = Bid;
RefreshRates();
ld_price = Ask;

Нам не важно, что возвратят функции  RefreshRates(), важно, чтобы в переменных Ask и Bid были последние, известные терминалу значения. 

 

Здравствуйте!

Подскажите в чем причина разных результатов выдаваемых тестером для одного советника?

Тестируемый период, валютная пара и таймфрейм одинаковы, но результаты полученные сегодня сильно отличаются от предыдущих, советник перестал открывать длинные позиции.

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

 
skyjet:

Здравствуйте!

Подскажите в чем причина разных результатов выдаваемых тестером для одного советника?

Тестируемый период, валютная пара и таймфрейм одинаковы, но результаты полученные сегодня сильно отличаются от предыдущих, советник перестал открывать длинные позиции.

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


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

Если же давно было предыдущее тестирование, может настройки открутились. 

 
Zhunko:

1. Если данные не поступили, и при этом все данные есть, но мы об этом ничего не знаем? Вернёт FALSE. Как это расценивать? Отсутствие данных или ошибка, или, всё же, данные есть?

Я не понял Вас. Давайте по порядку... Вызываем RefreshRates(), данные не поступили..  Но данные есть. Выходит нескладуха. Если данные не поступили, то их не будет, либо просто данные не обновились, т.к. рыночная переменная не изменилась... Есть только 2 варианта.

 Если после вызова RefreshRates() она вернула ТРУ, то данные обновились. А если вернёт ФЭЛС, то либо не обновились т.к. ошибка какая-н., либо не обновились т.к. данные свежи, и не требуют обновления.

 Потому я так понимаю, расценить это можно так: RefreshRates() проверяет данные, если данные не новы, то не обновляет те данные, которые не новы т.е. не изменились, а если новы, то обновляет. Значит, можно опираться только на флаг возвратимый функцией RefreshRates(). У Вас есть другие варианты? 

Zhunko:

2. Сверять надо чтобы решить проблему 1-го пункта. 

Вы сказали, что:

Я сверяю данные от сервера (MarketInfo()) с нулевым баром. Жду, когда они будут одинаковые.

 Ну MarketInfo() и так тянет с нулевого бара... Что ВЫ имеет в виду, под вышеприведёнными словами?

Zhunko:

3. Динамику процесса не учитываете. Включили комп, терминал. Пришли, как кажется все данные. Всё сошлось на нулевом баре. Сигналы найдены. Сделка совершена. Оказывается данные пришли не все. Через 5 минут пришли недостающие бары с номерами 1,2,3,4,5. Сигнал исчез. Что делать? 

Обновить снова. Но тогда возникает момент такой, а что если мы вызовем RefreshRates(), а он будет медленно обновлять данные? Т.е. часть расчётов произведётся с одними рыночными данными, а часть - с другими.. Что тогда? 

Zhunko:

4. Красным отметил. Ещё не обрабатывается возможная ошибка выбора неверного идентификатора в переключателе. Выше написал, как надо.

Бесполезно вызывать RefreshRates() без ожидания результата. Он может долго не свершиться. 

 Хм. Ну а с ожиданием если, котировка то может изменится.. Тут палка с двух сторон?

 

RefreshRates(); // Зачем этот тормоз без обработки возвращаемого значения? 

 Вы об этом несколько раз упоминаете, но канкретики так и нет. Т.е. я сколько вижу, как используют обычно данную функцию, так просто перед кодом, где используются переменные рыночных данных и всё. Особо типа не заморачиваются над этим. НО я подумал, и решил прикинуть, как это довести до ума. Что знать наверняка, что такой-то подход, действительно, верен и сработает при всех нормальных условиях.

 Так вот Вадим, что подразумеваете под данных выражением:

"

Зачем этот тормоз без обработки возвращаемого значения?"

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

 
Integer:


Она не неправильная, она просто мутноватая. 

Концовочка:

 
if (ld_price != 0)
    return (ld_price); 

Если ld_price = 0, то функция вернет 0 сама по себе. Поэтому не нужна проверка. 

 С чего бы то вдруг? Тут просто нужно через else, добавить, что функция возвращало ещё какое-то значение, что будет значить, что мол " Нет цены ". По ходу логично. Когда накидал функцию, думал больше о предыдущей логике, потом не обратил внимания на конец её. А почему функция 0 вернёт сама по себе что-то я не понял...
Integer:


Вот это разруливание: 

if (fs_symbol == Symbol())
{
    RefreshRates();
    ld_price = Bid;
}
else
    ld_price = MarketInfo(fs_symbol, MODE_BID);

 Тоже не нужно. Можно во всех случаях использовать MraketInfo(). 

В конце концов функция превращается в функцию MarketInfo() в чистом виде (если убрать все лишнее). 


 А зачем тогда Ask вообще (если уж говорить о цене покупки канкретно), если можно всегда использовать MarketInfo(fs_symbol, MODE_ASK) ? Ведь если так посмотреть, обращаясь к Ask нельзя быть уверенным что он точный в данный момент времени?
 
Integer:

Нам не важно, что возвратят функции  RefreshRates(), важно, чтобы в переменных Ask и Bid были последние, известные терминалу значения. 


По ходу практически нам нужно другое, на сколько я понимаю. А нужно нам последние Ask и Bid серверные, а не локальные терминальные. Ведь так?

Вот потому тут я развёл дискуссию, чтоб раз и на всегда понять, как логичнее и правильнее это организовывать. Ибо теоритически то верно, а практически... 

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