7777877: передача параметров от передачи параметров по ссылке?
вот передача параметров по ссылке, сделайте такой скрипт:
int start(){
int res = 999;
Print("func = ",func(res)," , res = ",res);
return(0);
}
//__________________________int func(int &a){
a = 10;
return(a*10);
}
во вкладке эксперты появится запись: 2012.04.08 11:19:35 test EURUSD,M5: func = 100, res = 10
ну и попытайтесь ответить на вопрос почему мы присвоили res = 999; а в журнале получили res = 10
вот передача параметров по ссылке, сделайте такой скрипт:
во вкладке эксперты появится запись: 2012.04.08 11:19:35 test EURUSD,M5: func = 100, res = 10
ну и попытайтесь ответить на вопрос почему мы присвоили res = 999; а в журнале получили res = 10
Ну мое объяснение такое:
В функции Print просисходит вызов к пользовательской функции func. В функцию func передается параметр res=999. При вычислении самой функции func используется параметр а=10. И обратно в место вызова функции func передается уже значение а*10=100. Т.к. по концовке мы имем значение res=10, то отсюда я заключаю, что передача параметра по ссылке означает следующее: можно передать в вызвываемую функцию (в данном случае в func) ЛЮБОЕ значение соответствующего типа (в данном случае res=999), но сама функция будет вычисляться уже с тем значением (т.е. в данном случае с а=10), к-е будет инициализировано внутри самой функции (к-е в частном случае может и совпадать со значением, передаваемым в вызываемую функцию, т.е. в данном случае в func). И при передаче вычисленного в функции (в данном случае в func) значения обратно в строку вызова функции, переменная (в данном случае res) уже будет иметь отличное от ранее значение, т.е. то, к-е она получила при вычислении функции func (т.е. в данном случае res=10). Итого: при передаче параметра в функцию по ссылке внутри вычисляемой функции может происходить изменения значения параметра и далее, после возврата вычисленного значения в строку вызова функции, этот параметр будет иметь уже ИЗМЕНЕННОЕ (в частном случае такое же) значение, к-е он получил пр вычислении вызываемой функции.
Скажите пожалуйста хочу сделать модификацию ордера, чтобы советник изменял величину стоп-лосса в определенное мною время, а он начинает дурить.
вот мой код
extern int tp = 350; // величина прибыли тейкпрофит extern int sl = 400; // величина убытка стоплосс
int ticket;
int start() { //---- if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // ордер открывается по времени в 2 часа 00 минут по терминальному времени ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red);
//----
if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // тут я задал условие, что модификацию ордера с выбранным тикетом, производить в 3 часа 00 минут по терминал. времени.
{ OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // тут указал выбор ордера, сделки OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); // модифицировать ордер с выбранным тикетом, от цены открытой позиции, изменить величину СЛ в пунктах, ТП оставляю без изменения
} //--
}
При тестировании возникает Проблема: Советник начинает производить много бесполезных модификаций в течении времени, с 3 часов 00 минут до 3 59. Советник дурит и производит каждую секунду модификацию ! ПОЧЕМУ? что не правильно написано в коде?
Скажите пожалуйста хочу сделать модификацию ордера, чтобы советник изменял величину стоп-лосса в определенное мною время, а он начинает дурить.
вот мой код
extern int tp = 350; // величина прибыли тейкпрофит extern int sl = 400; // величина убытка стоплосс
int ticket;
int start() { //---- if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // ордер открывается по времени в 2 часа 00 минут по терминальному времени ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red);
//----
if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // тут я задал условие, что модификацию ордера с выбранным тикетом, производить в 3 часа 00 минут по терминал. времени.
{ OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // тут указал выбор ордера, сделки OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); // модифицировать ордер с выбранным тикетом, от цены открытой позиции, изменить величину СЛ в пунктах, ТП оставляю без изменения
} //--
}
При тестировании возникает Проблема: Советник начинает производить много бесполезных модификаций в течении времени, с 3 часов 00 минут до 3 59. Советник дурит и производит каждую секунду модификацию ! ПОЧЕМУ? что не правильно написано в коде?
Как прописать правильно функцию модифицировать открытый ордер в счете ECN где сразу стоп и профит не поставишь, а делать надо через модификацию.
Ввобщем беда в том что, что-то не так, помогите найти ошибку.
extern int tp = 350; // величина прибыли тейкпрофит extern int sl = 400; // величина убытка стоплосс
int ticket; int start() { //---- if (OrdersTotal()==0 && Close[1]<Open[1] && High[1]<Bid) )==0) // ордер открывается по условиям ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0t,"",123,0,Red); //---- if (OrdersTotal()==1 ) // тут я задал условие, что модификацию ордера с выбранным одним ордером. { OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // тут указал выбор ордера, сделки OrderModify(ticket, OrderOpenPrice(), Ask+sl*Point,Ask-tp*Point,0,Blue); // модифицировать ордер с выбранным тикетом, от цены открытой позиции, изменить величину СЛ в пунктах, ТП оставляю без изменения } }
Люди, объясните кто-нибуь в доступной форме, что такое передача параметров по ссылке. Документацию прочитал, но понял оттуда лишь то, что это возможно и после идентификации переменной обязательно надо ставить модификатор &. Было бы супер, если бы объяснение было сопровождено к-л небольшой программкой с пояснениями... Чем вообще отличается обычная передача параметров от передачи параметров по ссылке?
Общий смысл передачи параметра по ссылке, это передача в параметр не самой переменной, а её адреса. В противоположном случае передаётся копия переменной в параметр.
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
вот передача параметров по ссылке, сделайте такой скрипт:
во вкладке эксперты появится запись: 2012.04.08 11:19:35 test EURUSD,M5: func = 100, res = 10
ну и попытайтесь ответить на вопрос почему мы присвоили res = 999; а в журнале получили res = 10
Подскажите как подключить библиотеки? Они есть есть в файлах mqh, но при Копмилировании выдает
'strlib.mqh' - cannot open the program file
вот передача параметров по ссылке, сделайте такой скрипт:
во вкладке эксперты появится запись: 2012.04.08 11:19:35 test EURUSD,M5: func = 100, res = 10
ну и попытайтесь ответить на вопрос почему мы присвоили res = 999; а в журнале получили res = 10
Ну мое объяснение такое:
В функции Print просисходит вызов к пользовательской функции func. В функцию func передается параметр res=999. При вычислении самой функции func используется параметр а=10. И обратно в место вызова функции func передается уже значение а*10=100. Т.к. по концовке мы имем значение res=10, то отсюда я заключаю, что передача параметра по ссылке означает следующее: можно передать в вызвываемую функцию (в данном случае в func) ЛЮБОЕ значение соответствующего типа (в данном случае res=999), но сама функция будет вычисляться уже с тем значением (т.е. в данном случае с а=10), к-е будет инициализировано внутри самой функции (к-е в частном случае может и совпадать со значением, передаваемым в вызываемую функцию, т.е. в данном случае в func). И при передаче вычисленного в функции (в данном случае в func) значения обратно в строку вызова функции, переменная (в данном случае res) уже будет иметь отличное от ранее значение, т.е. то, к-е она получила при вычислении функции func (т.е. в данном случае res=10). Итого: при передаче параметра в функцию по ссылке внутри вычисляемой функции может происходить изменения значения параметра и далее, после возврата вычисленного значения в строку вызова функции, этот параметр будет иметь уже ИЗМЕНЕННОЕ (в частном случае такое же) значение, к-е он получил пр вычислении вызываемой функции.
Я правильно понял?
да именно так
Гроссе данке шён!!!
Скажите пожалуйста хочу сделать модификацию ордера, чтобы советник изменял величину стоп-лосса в определенное мною время, а он начинает дурить.
вот мой код
extern int tp = 350; // величина прибыли тейкпрофит
extern int sl = 400; // величина убытка стоплосс
int ticket;
int start()
{
//----
if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // ордер открывается по времени в 2 часа 00 минут по терминальному времени
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red);
//----
if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // тут я задал условие, что модификацию ордера с выбранным тикетом, производить в 3 часа 00 минут по терминал. времени.
{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // тут указал выбор ордера, сделки
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); // модифицировать ордер с выбранным тикетом, от цены открытой позиции, изменить величину СЛ в пунктах, ТП оставляю без изменения
}
//--
}
При тестировании возникает Проблема: Советник начинает производить много бесполезных модификаций в течении времени, с 3 часов 00 минут до 3 59. Советник дурит и производит каждую секунду модификацию ! ПОЧЕМУ? что не правильно написано в коде?
Скажите пожалуйста хочу сделать модификацию ордера, чтобы советник изменял величину стоп-лосса в определенное мною время, а он начинает дурить.
вот мой код
extern int tp = 350; // величина прибыли тейкпрофит
extern int sl = 400; // величина убытка стоплосс
int ticket;
int start()
{
//----
if (OrdersTotal()==0 && Hour( )==2 && Minute( )==0) // ордер открывается по времени в 2 часа 00 минут по терминальному времени
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,Ask+sl*Point,Ask-tp*Point,"",123,0,Red);
//----
if (OrdersTotal()==1 && Hour( )==3 && Minute( )==0) // тут я задал условие, что модификацию ордера с выбранным тикетом, производить в 3 часа 00 минут по терминал. времени.
{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // тут указал выбор ордера, сделки
OrderModify(ticket, OrderOpenPrice(), Ask+300*Point, OrderTakeProfit(),0,Blue); // модифицировать ордер с выбранным тикетом, от цены открытой позиции, изменить величину СЛ в пунктах, ТП оставляю без изменения
}
//--
}
При тестировании возникает Проблема: Советник начинает производить много бесполезных модификаций в течении времени, с 3 часов 00 минут до 3 59. Советник дурит и производит каждую секунду модификацию ! ПОЧЕМУ? что не правильно написано в коде?
Зачем по времени.....по профиту!!
Как прописать правильно функцию модифицировать открытый ордер в счете ECN где сразу стоп и профит не поставишь, а делать надо через модификацию.
Ввобщем беда в том что, что-то не так, помогите найти ошибку.
extern int tp = 350; // величина прибыли тейкпрофит
extern int sl = 400; // величина убытка стоплосс
int ticket;
int start()
{
//----
if (OrdersTotal()==0 && Close[1]<Open[1] && High[1]<Bid) )==0) // ордер открывается по условиям
ticket=OrderSend(Symbol(),OP_SELL,1,Bid,0,0,0t,"",123,0,Red);
//----
if (OrdersTotal()==1 ) // тут я задал условие, что модификацию ордера с выбранным одним ордером.
{
OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES); // тут указал выбор ордера, сделки
OrderModify(ticket, OrderOpenPrice(), Ask+sl*Point,Ask-tp*Point,0,Blue); // модифицировать ордер с выбранным тикетом, от цены открытой позиции, изменить величину СЛ в пунктах, ТП оставляю без изменения
}
}
#include <strlib.mgh>и замените на:
#include <stdlib.mgh>Люди, объясните кто-нибуь в доступной форме, что такое передача параметров по ссылке. Документацию прочитал, но понял оттуда лишь то, что это возможно и после идентификации переменной обязательно надо ставить модификатор &. Было бы супер, если бы объяснение было сопровождено к-л небольшой программкой с пояснениями... Чем вообще отличается обычная передача параметров от передачи параметров по ссылке?