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

 
xant:

rigonich 

Это вы типа пошутили что ли? В каком месте смеяться?

 TarasBY

Не можете? Ну так не брались бы.

Я вам русским языком написал - в учебнике про объявлление глобальных переменных почти ничего нет. Например я не знаю что такое  fGet_MineGV();

Это функция? Если да, то что она делает? В учебнике     поиск по fGet дает нулевой результат. 

Что я должен объявить в  int init() ?  Вы написали: 

{
fGet_MineGV();
}


Вот у меня в советнике инициализация Инит выглядит так:

 int init()
{
ArrayInitialize(buf3,0);
ArrayInitialize(b1,0);
ArrayInitialize(b2,0);
ArrayInitialize(b3,0);
ArrayInitialize(b4,0);


Comment("Вычисление среднего значения "+ind);
m1=NormalizeDouble(iCustom(NULL,tf,ind+"_a",0,0),2);
string d="Среднее значение "+ind+" "+DoubleToStr(m1,2);
tm=TimeCurrent();
int q=0,ticket=-1;
double opr=0,lot1=0;
for(q=0;q<OrdersTotal();q++)
{

и так далее, еще 100 строк. Куда, конкретно в какое место, а главное что именно я должен тут объявить? Неужели по русски сложно написать. Давай пальцы гнуть, ага.  

 

 

  Это функция? Если да, то что она делает? В учебнике     поиск по fGet дает нулевой результат.

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

      void fGet_MineGV (string fs_PrefName = ""// префикс имени переменной
       {
        string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
        if (GlobalVariableCheck (ls_Name)) SUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
        if (GlobalVariableCheck (ls_Name)) SUA1 = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
        if (GlobalVariableCheck (ls_Name)) BUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
        if (GlobalVariableCheck (ls_Name)) BUA1 = GlobalVariableGet (ls_Name);
        //----
    }
 
Добрый вечер! Трейлингстоп работает сразу, сразу от постановки ордера. А должен работать, только когда ордер с тикетом tocket пирийдет на историю, причем перейдет строго по тейкпрофиту. 


//***************************************   
 
  nahodka=false;
 
 
 if (OrderSelect(tocket, SELECT_BY_TICKET , MODE_HISTORY))  
 if (OrderTakeProfit( )-3*Point<profitsell&&OrderTakeProfit( )+3*Point>profitsell) nahodka=true;
     // Находим ордер, сработавший именно по тейкпрофиту 
 
 
  
 if(nahodka){if (OrderSelect(tecket,SELECT_BY_TICKET)){
 if(OrderStopLoss( )>Bid+treylingstop*Point ){ Print ("четвёртаямодифи    " );
 OrderModify(  tecket, OrderOpenPrice(), Bid+treylingstop*Point, OrderTakeProfit(), 0, CLR_NONE);}}}
  // Модифицируем оставшийся ордер
 for ( i = OrdersTotal() - 1; i >= 0; i--)
 

rigonich

я так и сделал в самом начале. Внутри функции init вставил этот кусок кода, откомпилировал, получил замечание:

 Function "fGet_MineGV" is not referenced and will be removed from exp-file

Это замечание мне понятно, ведь записи еще нет, он считать ничего не может, так?

После этого я прописываю вторую часть кода уже внутри функции  start. Этот кусок выглядит так:

 void fSave_MineGV (string fs_PrefName = "") // префикс имени переменной
{
static datetime ldt_NewBar;
datetime ldaTBeginBar = iTime (Symbol(), 1, 0)
//---- Сохраняемся в начале каждой минуты
if (ldt_NewBar == ldaTBeginBar) return;
ldt_NewBar = ldaTBeginBar;
//---- Сохраняем поочереди значения каждой переменной
string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
GlobalVariableSet (ls_Name, SUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
GlobalVariableSet (ls_Name, SUA1);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
GlobalVariableSet (ls_Name, BUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
  GlobalVariableSet (ls_Name, BUA1);
}

 

Здесь все правильно? 

 

Эту часть кода я вставляю сразу после расчета SUA, SUA1, BUA,BUA1.

Но при компиляции советник выдает:

 27 error(s), 64 warning(s)

 

xant:

rigonich

я так и сделал в самом начале. Внутри функции init вставил этот кусок кода, откомпилировал, получил замечание:

 Function "fGet_MineGV" is not referenced and will be removed from exp-file

Это замечание мне понятно, ведь записи еще нет, он считать ничего не может, так?

После этого я прописываю вторую часть кода уже внутри функции  start. Этот кусок выглядит так:

 void fSave_MineGV (string fs_PrefName = "") // префикс имени переменной
{
static datetime ldt_NewBar;
datetime ldaTBeginBar = iTime (Symbol(), 1, 0)
//---- Сохраняемся в начале каждой минуты
if (ldt_NewBar == ldaTBeginBar) return;
ldt_NewBar = ldaTBeginBar;
//---- Сохраняем поочереди значения каждой переменной
string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
GlobalVariableSet (ls_Name, SUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
GlobalVariableSet (ls_Name, SUA1);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
GlobalVariableSet (ls_Name, BUA);
ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
  GlobalVariableSet (ls_Name, BUA1);
}

 

Здесь все правильно? 

 

 


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

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

 {

fGet_MineGV();
}

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

 
Dimka-novitsek:
Добрый вечер! Трейлингстоп работает сразу, сразу от постановки ордера. А должен работать, только когда ордер с тикетом tocket пирийдет на историю, причем перейдет строго по тейкпрофиту. 

Но ведь если у вас история не пустая, вы практически наверняка найдете в ней ордер, сработавший именно по тейкпрофиту? Видимо, вы не ищите в истории ордер, закрытый по тп, а проверяете по истории , как закрылся нужный вам ордер, и закрылся ли он вообще. Вот это и проверяйте, зачем вы проверяете, чему конкретно равна цена закрытия вашего ордера? Три варианта -- 1. цена закрытия==0 -- ордер, если рыночный, отсутствует в истории(OrderSelect()вернет false) 2. цена закрытия равна
OrderTakeProfit()
 -- ордер закрылся по тп,     3.  цена закрытия не равна
OrderTakeProfit() 
-- ордер закрылся не по тп . 
 
 

rigonich

Опять двадцать пять. Я спросил предельно конкретно - правильно ли я сделал первый шаг. Вы не ответили на прямой вопрос, не сказали ни слова по существу. 

 Да, конечно, я читал учебник, но поскольку у меня профессия, к программированию не имеющая никакого отношения, то ясно, что я прошу четкого, простого, конкретного алгоритма. Ну неужели это трудно понять? Если вам сложно ответить по существу, так зачем напрягаться? Просто проходите мимо. 

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

_______________

 

Просьба - кто-нибудь напишите мне на мыло neroy(собака)mail.ru , кто может тупо взять код советника и вставить в него то, что нужно в нужное место. 

 
xant:

rigonich

Опять двадцать пять. Я спросил предельно конкретно - правильно ли я сделал первый шаг. Вы не ответили на прямой вопрос, не сказали ни слова по существу. 

 Да, конечно, я читал учебник, но поскольку у меня профессия, к программированию не имеющая никакого отношения, то ясно, что я прошу четкого, простого, конкретного алгоритма. Ну неужели это трудно понять? Если вам сложно ответить по существу, так зачем напрягаться? Просто проходите мимо. 

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

_______________

 

Просьба - кто-нибудь напишите мне на мыло neroy(собака)mail.ru , кто может тупо взять код советника и вставить в него то, что нужно в нужное место. 


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

 

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

 
rigonich:

вообще то это ваш код , частично исправленный другим человеком.


мой код ошибок не давал. Но и результата не давал.

А его код даже работать не стал, ибо 24 ошибки....

но идею я уловил..и теперь все работает. 

 

компилятор конечно бесчеловечен. Сейчас чуть мозг не сломался почему показывается ошибка 

'(' - function definition unexpected G:\Program_Files_2\MT4-demo\experts\3.mq4 (139, 14)

в то время когда этот советник вчера работал на УРА, а сегодня я лишь раскрыл длинное IF на несколько коротких if....

 

Оказалось кавычку пропустил примерно в КИЛОМЕТРЕ от того места где компилятор указывал ошибку!К тому же про кавычку он молчал, его видите ли ФУНКЦИЯ не устраивала....:(((((((( 

 

rigonich

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

Вот что уходит в блок инициализации:

 

 void fGet_MineGV (string fs_PrefName = "") // префикс имени переменной
     {
        string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
        if (GlobalVariableCheck (ls_Name)) SUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
        if (GlobalVariableCheck (ls_Name)) SUA1 = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
        if (GlobalVariableCheck (ls_Name)) BUA = GlobalVariableGet (ls_Name);
        ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
        if (GlobalVariableCheck (ls_Name)) BUA1 = GlobalVariableGet (ls_Name);
     }

Вот что уходит в основной блок 

 

 void fSave_MineGV (string fs_PrefName = "") // префикс имени переменной
{
 static datetime ldt_NewBar;
 datetime ldaTBeginBar = iTime (Symbol(), 1, 0)
 //---- Сохраняемся в начале каждой минуты
 if (ldt_NewBar == ldaTBeginBar) return;
 ldt_NewBar = ldaTBeginBar;
 //---- Сохраняем поочереди значения каждой переменной
 string ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_1");
 GlobalVariableSet (ls_Name, SUA);
 ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_2");
 GlobalVariableSet (ls_Name, SUA1);
 ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_3");
 GlobalVariableSet (ls_Name, BUA);
 ls_Name = StringConcatenate (fs_PrefName, Symbol(), "_N_4");
  GlobalVariableSet (ls_Name, BUA1);
}

Как видите, переменные я переименовал. 

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

Судя по вашему высокопрофессиональному объяснению, именно это я и должен был сделать, потому что это  понятно любому начинающему. По вашему мнению, все должно работать. Но не работает. Вот лучшее, чего мне удалось добиться:

 

8 error(s), 0 warning(s)        
Причина обращения: