Нужна помощь в написании советника.

 
Собственно говоря вопрос в коментариях. (код урезался, что бы долго в нем не разбираться, однако он компилируеться и исполняеться, хоть и не так как я хочу)
Я конечно программирование плоховато знаю, так основы.
Но судя по всему переменная ticket в цикле for невидна, почему?

И кстати зачем стоят везде return (0); ? Я просто перекопировал с какого-то примера.
Ну лудна в функциях ( хотя не ясно зачем если нечего возвращать), а в операторе if?
Что там и куда возвращаеться?
#property copyright "Hell"#property link "" extern double LossStop = 50; extern double Lots = 1; int start() { int ticket, x, total; total=OrdersTotal(); if(total<1) { if (TRUE) { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-LossStop*Point,0,"Order",12332,0,Green); Print ( " ticket = ", ticket); // Тут всё хорошо return(0); } return(0); } for (x=1; x<2; x++) { Print ( " ticket = ", ticket); // А тут ticket = 0. Почему? if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==TRUE) // И соответственно условие будет всегда FALSE :(. // Собственно говоря из-за этого момента и весь сыр бор { Print ( " Цена открытия: ", OrderOpenPrice()); } } return (0); }
 
ticket единственно определяется в блоке
if(total<1)

то есть, если ордеров нет.

Причём, при любых обстоятельствах программа заканчивает работу по достижении в этом блоке
return(0);


А в блок
for (x=1; x<2; x++)
управление передаётся, если ордера есть, но здесь нигде ticket не определяется, потому и печатает своё естественное сотояние, а именно = 0.

Т.е. всё правильно работает. Вернее, работает так, как написано.
 
return(0); - сорри, небольша поправочка, не программа заканчивает работу, а функция, в данном случае start
 
SKif:
ticket единственно определяется в блоке
if(total<1)

то есть, если ордеров нет.

Причём, при любых обстоятельствах программа заканчивает работу по достижении в этом блоке
return(0);


А в блок
for (x=1; x<2; x++)
управление передаётся, если ордера есть, но здесь нигде ticket не определяется, потому и печатает своё естественное сотояние, а именно = 0.

Т.е. всё правильно работает. Вернее, работает так, как написано.
ссори за мою тупость, но почему значение ticket не передаеться в блок for? Ведь ордер по любому есть из-за
if (TRUE)

и ticket определён в пределах одной функции start.
Хотя конечно скорее всего это следствие моей безграмотности. Лучше скажите как быть?
Мне нужно именно что-бы ticket определённый в блоке if, я смог использовать и в блоке for. Как это сделать?

За return спасибо. Тут всё ясно, я просто об этом забыл.
 
#property copyright "Hell" #property link "" extern double LossStop = 50; extern double Lots = 1; int ticket; /// !!!!!!!!!!! Тут надо тикет ставить int start() { int x, total; total=OrdersTotal(); if(total<1) { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-LossStop*Point,0,"Order",12332,0,Green); Print ( " ticket = ", ticket); // Тут всё хорошо return(0); } else { Print ( " ticket = ", ticket); // А тут ticket = 0. Почему? if (OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==TRUE) { Print ( " Цена открытия: ", OrderOpenPrice()); } } return (0); }


Может вот так надо??? Тикет обнуляется после каждой перезагрузки функции старт,поэтому надо его обьявлять глобально...
 
Так вопрос снимаеться как дурацкий :)
Вся заморочка в этих return(0);
Ведь после него значение ticket обнуляеться и до блока for не доходит.

ВСЕМ СПАСИБО!
 
Ronen:
int ticket; /// !!!!!!!!!!! Тут надо тикет ставить


Может вот так надо??? Тикет обнуляется после каждой перезагрузки функции старт,поэтому надо его обьявлять глобально...
Именно так!
Ещё раз спасибо!
 
Вообще-то это безграмотно ;)
Насколько я понял, задача состоит в том, чтоб после открытия позиции на каждом тике выводить значение цены открытия (например)?
Тогда это делается проще - тикет можно вообще не сохранять, вместо этого надо перебирать все открытые позиции, выбирать нужную по мейджик намберу и тогда уже печатать всё, что надо =)
Примерно так:
#property copyright "Hell" #property link "" extern double LossStop = 50; extern double Lots = 1; int start() { int total, ticket; total=OrdersTotal(); if(total<1) { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-LossStop*Point,0,"Order",12332,0,Green); Print ( " ticket = ", ticket); // Тут всё хорошо return(0); } else { for ( int z = total - 1; z >= 0; z -- ) { if ( !OrderSelect( z, SELECT_BY_POS ) ) { Print( "OrderSelect( ", z, ", SELECT_BY_POS ) - Error #", GetLastError() ); continue; } if ( OrderMagicNumber() == 12332 && OrderSymbol() == Symbol() ) { Print ( "ticket = ", OrderTicket() ); Print ( " Цена открытия: ", OrderOpenPrice()); } } return (0); }
 
А это самая близкая (и корректная!) интерпретация идеи Hell-а:

Хочу заметит, что и Стоплосс и Тейкпрофит выполняют обратную операцию
(они закрывают!) поэтому при Buy пользуем Ask, но для тейкпрофит и стоплосс - Bid
и наоборот.

//+------------------------------------------------------------------+ //| Hell.mq4 | //| Itso | //| itso_at_dir_dot_bg | //+------------------------------------------------------------------+ #property copyright "Itso" #property link "itso_at_dir_dot_bg" //---- input parameters extern double LossStop=50.0; extern double Lots=1.0; int start() { int ticket, i, total; total = OrdersTotal(); if (total!=0) for(i=0;i<total;i++) if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==TRUE) { Print ( " ticket = ", OrderTicket()); Print ( " Open price: ", OrderOpenPrice()); } else { ticket = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-LossStop*Point,0,"Order",12332,0,Green); Print ( " ticket = ", ticket); } return(0); }
 
Вообще-то это безграмотно ;)
:))))
Вообщето код никакую смысловую нагрузку не несёт ( во всяком случае для меня).
Я просто разбираюсь с mql4, напоролся на вопрос и никак не смог найти ответа. Урезал програмку что-бы было ясно и понятно, но отображала суть. Суть эта и заключалась в вопросе, почему не передаеться значение?
Однако это результата не принесло :(. Потому я и обратился с просьбой сюда. Вот и всё :)

Но я рад, что темка пошла дальше вороса, вот я уже кой-чё интересное почерпнул!
 
Hell:
Так вопрос снимаеться как дурацкий :)
Вся заморочка в этих return(0);
Ведь после него значение ticket обнуляеться и до блока for не доходит.

ВСЕМ СПАСИБО!

.....написания алгоритмов. Голову дурить всё одно охота, я ей никогда не позволяю засохнить.:). Свои идеи зашли в ступор.....

У меня вопрос
Не мoгли бы Вы написать прогу на mql4
тк я не разбираюсь в этом языке ,
...передвижение SL вслед за движением
курса ...

размер моей благодарности не будет иметь границ, в приделах разумного.....

С уваженем Сергей
wasp@pike.net.ru
Причина обращения: