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

 
Code:


Спасибо за ответ и отвечаю на Ваши вопросы.

Та самая характеристика - это как раз вся идея индикатора. А заодно упражнение по MQL. Придумал себе задачу, интуитивно понимаю, что ее реализация на языке не очень сложная. Сижу, пробую.

Так вот, суть характеристики состоит в том, что я сравниваю некий фиксированный теоретический уровень двух однонаправленных объемов с фактическим уровнем. Т.е., если фактические отношение суммы двух объемов к фактическому интервалу "открытие-закрытие" выше заданного теоретического, я добавляю к фактическому второму объему "бонус" в виде разницы между посчитанным теоретическим и фактическим результатами. Если фактический уровень ниже теоретического, отнимаю от объема второго бара такую же разницу. Внятно ли получилось объяснить?

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

Кроме того, мне кажется, что те строки, которые Вы считаете эквивалентными моим приведут к делению на ноль. Сейчас буду проверять.

Внятно. Но не понятно как взаимосвязаны 2 (среднее между двумя объёмами) и то что рассчитывается в переменной UP12. Ведь размерности той и другой величины разные. Разы и цена в знаменателях. Ведь ещё в школе Нас учили, что метры и килограммы не сложить никак! :))))


Точно ведь, не правильно! :)))) Одно дело формулы в виде дробей, а другое дело всё в одну строку и непонятно как... Это уже невнимательность, а не торопливость...

А ещё Я код оптимизировал неправильно. Там опять же в математике ошибка. Скобки забыл.

   double vrealUP12=(dVolume+vback1)/((Close[i]-Open[i+1])*1000);
 
Roman.:

Ваша сциль не туда вовсе... совсем к не тем торговым критериям, вопрос-то о СТО-ХАС-ТИ-КЕ... :-Р

Вопрос ведь был вот в чём:

ideasforlife:

Если выполняется условие1, то:
-проверить наличие открытых ордеров по SELL
-если есть - закрыть их
-можно сделать проверку на наличие средств на счете
-открыть ордер на BUY

То же самое если выполняется условие2, то:
-проверить наличие открытых ордеров по BUY
-если есть - закрыть их
-можно сделать проверку на наличие средств на счете
-открыть ордер на SELL
+ анализ ошибок(не главное, но можно)

Причём тут СТОХАСТЕГ??? :))))

Вся нужная проверка уже сделана и сформирован либо не сформирован торговый сигнал.

 
demlin:

Всем привет!

Благодаря неоценимой помощи экспертов этой ветки (особенно Roman'а) мне удалось состряпать простенький советник, показавший + на тестере. Вопрос: как определить можно ли его выставлять на реал? Есть ли какие-либо критерии?


Да, какие критерии, отрабатываете "базовые" вещи (заточка под реал - контроль за дисконнектом и переключением на дополнительную линию я не учитываю), в виде грамотной обработки возможных ошибок с принятием экспертом соответствующих организационных решений по дальнейшей работе, далее в обязательном порядке демо, затем микрореал... При устраивающих Вас результатах - "пускаетесь во все тяжкие"...:-))) Для начала, разберите обработку ошибок советника с учебника, перед выставлением ордеров не забывайте проводить необходимые проверки требований и ограничений при проведении торговых операций, в поиске наберите через гугл что-нибудь типа: Обработка ошибок site:mql4.com, Подготовка cоветника к реалу site:mql4.com, у меня (часть :-Р) эксперта, выполняющего подобные ф-ии такая:

// После старта
if (!IsTradeAllowed() || IsTradeContextBusy() || !IsConnected()) return; // если торговля невозможна, то выходим

Проверка выбора ордера для работы с ним

                if (ticket>0)                                               // Если позиция открылась
                    {
                       while(OrderSelect(ticket,SELECT_BY_TICKET)==false) Sleep(1000);     // Если ордер выбран
                         double OpenPrice=OrderOpenPrice();
                         ...  
                           

В начале

color ColorBuy = Blue, ColorSell = Red;
bool UseSound = true;
string alert.wav;
color clr, ClrClose = Gray;
int Level_new; 
double price;
bool result, Buy_signal=false, Sell_signal=false;
int  orderIndex;
bool IsExpertFailed = false;
bool IsExpertStopped = false;
double lots;                       // вспомогательная переменная для расчета нового размера лота 
double Lots_New;                   // Количество лотов для новых ордеров
int ticket;                        // Номер ордера
double orderLots;                  // Lots   
double orderProfit;                // Profit
double Price;                      // Цена открытия рыночного ордера
double SL;                         // Значение StopLoss ордера
double  TP;                        // Значение TakeProfit ордера
static datetime prevtime = 0;       // по ценам открытия

int init(){
    IsExpertStopped = false;
    if (!IsTradeAllowed())
       {
         Comment("Необходимо разрешить советнику торговать");
         IsExpertStopped = true;
         return (0);
       }
      
    if (!IsTesting())
       {
         if (IsExpertEnabled())  Comment("Советник запустится следующим тиком");       
           else  Comment("Отжата кнопка \"Разрешить запуск советников\"");
      
       }
    ...
   
   return (0);
}

Все, ИМХО, для начала, продолжать можно еще долго...

В любом случае, контроль "Управляющего" необходим... :-Р Дабы не было мучительно больно за слитые депы...

 

MaxZ:


Вопрос ведь был вот в чём:

Причём тут СТОХАСТЕГ??? :))))

Вся нужная проверка уже сделана и сформирован либо не сформирован торговый сигнал.


Был прямой вопрос:

"Это все по текущей валютной паре.
int start()
{
double M_0, M_1, // Значение MAIN на 0 и 1 барах
S_0, S_1; // Значение SIGNAL на 0 и 1барах
//--------------------------------------------------------------------
// Обращение к функции техн.индикат.
M_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, 0);// 0 бар
M_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, 1);// 1 бар
S_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);// 0 бар
S_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);// 1 бар
//--------------------------------------------------------------------

if( M_1 < S_1 && M_0 >= S_0 ) // УСЛОВИЕ 1: Зеленая пересекает красную снизу

if( M_1 > S_1 && M_0 <= S_0 ) // УСЛОВИЕ 2: Зеленая пересекает красную сверху

//--------------------------------------------------------------------
return; // Выход из start()
}"

По большому счету, по фигу, ИМХО, сцилки к автору направили, разберется... :-Р

 

Roman.:


В начале

...
int init(){
    IsExpertStopped = false;
    if (!IsTradeAllowed())
       {
         Comment("Необходимо разрешить советнику торговать");
         IsExpertStopped = true;
         return (0);
       }
...

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

 
MaxZ:

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

Я делаю так:


F1 нажмите на
IsTradeAllowed()

узнаете... :-Р

А именно "

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

 
Roman.:

F1 нажмите на

узнаете... :-Р

А именно "

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

Дошло... Я совсем сегодня рассеян. Вижу init(), а думаю о start()! :)))))

 
MaxZ:

Внятно. Но не понятно как взаимосвязаны 2 (среднее между двумя объёмами) и то что рассчитывается в переменной UP12. Ведь размерности той и другой величины разные. Разы и цена в знаменателях. Ведь ещё в школе Нас учили, что метры и килограммы не сложить никак! :))))


Точно ведь, не правильно! :)))) Одно дело формулы в виде дробей, а другое дело всё в одну строку и непонятно как... Это уже невнимательность, а не торопливость...

А ещё Я код оптимизировал неправильно. Там опять же в математике ошибка. Скобки забыл.


MaxZ, торопитесь, ох торопитесь :))) с выводами!

Я километры и килограммы не складывал. Пример из реальной жизни. Сегодняший евродоллар, 5 минут. Просто ткнул в график где 2 растущих свечи подряд.

vback1=703, dVolume=696. (vback1+dVolume)/2=699,5.

По этим же свечам (Close[i]-Open[i+1] )*1000=(1.42911-1.42549)*1000=3.62

(vback1+dVolume)/3.62=386.5

Итого: 696+699.5-386.5=1009. Которые и должны быть отрисованы. И которые, именно 1009, показывает в этом месте индикатор. Ну и так далее.

Другое дело, что просчитав этот пример вот тут, я сам обнаружил, что по формуле, заложенной в код, не происходит того, что я расписал Вам в предыдущем посте. По факту получилась другая идеология, своего рода саморегуляция. До тех пор, пока минусовые значения параметра vrealUP12 не превысят сумму dVolume+vteor12, будет прибавка к последнему объему. Или надо вводить дополнительные параметры обсчета ExtVolumesBuffer[i]. 

А в строке

double vrealUP12=(dVolume+vback1)/((Close[i]-Open[i+1])*1000);

я сразу вернул на 

double vrealUP12=(dVolume+vback1)/UP12;

чтоб не удлинять. 

 
Code:


MaxZ, торопитесь, ох торопитесь :))) с выводами!

Я километры и килограммы не складывал. Пример из реальной жизни. Сегодняший евродоллар, 5 минут. Просто ткнул в график где 2 растущих свечи подряд.

Блин... Складываете и ещё как! :))

Переменная vteor12 имеет размерность Объёмов (это Наши метры).

vteor12=(dVolume+vback1)/2;

Переменная UP12 имеет размерность Пунктов по какой-то валютной паре.

UP12=(Close[i]-Open[i+1])*1000

Переменная vrealUP12 имеет размерность отношения Объёмов к Пунктам (это Наши килограммы).

vrealUP12=(dVolume+vback1)/UP12;

И в конце концов Вы рассчитываете Вашу характеристику, которая является суммой метров и килограмм, о чём и речь! ;D

ExtVolumesBuffer[i]=dVolume+vteor12-vrealUP12;


Если только 2 - это не 20 пунктов, которые должна проходить в теории Цена за два бара! :)) Но это же бред какой-то уже...


Code:


А в строке

double vrealUP12=(dVolume+vback1)/((Close[i]-Open[i+1])*1000);

я сразу вернул на

double vrealUP12=(dVolume+vback1)/UP12;

чтоб не удлинять.

Удлинение иногда полезно. Экономит ресурсы компьютера! :))) Зачем нужна эта лишняя переменная?

 
MaxZ:

Блин... Складываете и ещё как! :))

Переменная vteor12 имеет размерность Объёмов (это Наши метры).

Переменная UP12 имеет размерность Цены.

Переменная vrealUP12 имеет размерность отношения Объёмов и Цены (это Наши килограммы).

И в конце концов Вы рассчитываете Вашу характеристику, которая является суммой метров и килограмм, о чём и речь! ;D


ОК, попробуем по другому посмотреть.

 vteor12 можно записать как (dVolume+vback1)/к1 (коэффициент 1)

 vrealUP12 можно записать как (dVolume+vback1)/к2 (коэффициент 2)

Как я уже пытался расписать идеологию индикатора, она состоит в сравнении некоего теоретического и фактического уровней. Для получения этих уровней я одну и ту же величину (dVolume+vback1) сравниваю (т.е. делю)  с некоей теоретической величиной (к1) и фактической (к2). Понято, что к1 я просто  придумываю, если уж называть вещи своими именами. Или, если хотите, делаю допущение. Теперь это надо с чем-то сравнить. Ничего более объективного и истинного, чем сам график в этом деле не существует. Поэтому я беру разницу открытия и закрытия, воспринимая их как итоговый результат данного промежутка времени. И здесь только одна задача - привести к одинаковой разрядности, именно поэтому умножается на 1000.

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

А с точки зрения школьной логики Вы правы. Я складываю Объем + Объем/Цена, так в школе делать нельзя. :))

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