![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Очень простое - передать 1 параметр-указатель вместо 12 :)
1. это и выглядит нагляднее
2. если потом нужно будет добавить/убрать параметр, то достаточно будет изменить только структуру, не правя во всех местах вызовы
3. клонировать структуру проще - это одна переменная, а не 12 (например, если нужно создать еще один экземпляр индикатора)
Преимуществ масса, а вот на скорости это точно не отразилось бы. Какая разница - перейти по одному указателю или по 2-м последовательно? Для производительности - никакой разницы.
по указателям нельзя, можно по ссылкам, но они какие-то в MQL4 странные, постоянно надо ставить эксперименты
а в следующей версии уже не работает
пример передачи массивов в функцию, с возвратом значений, как обычно, инфы ноль, делал на основе экспериментов
// в MQL4 нельзя передать ссылочные переменные, надо делать их &массивом[]
// все переменные - массивы длиной 1
CODLL_EXPFUNC int __stdcall dll_GetCommandOrderSend(int cmdID[], MqlStr symbol[], int cmd[], double volume[], double price[],
int slippage[], double stoploss[], double takeprofit[], MqlStr comment[], int magic[], datetime expiration[], color arrow_color[])
{
cmdID[0] = 123;
symbol[0].string = "EURUSD";
а какие проблемы? ну получите округленное число, и всё. ошибки не будет.
по указателям нельзя, можно по ссылкам, но они какие-то в MQL4 странные, постоянно надо ставить эксперименты
а в следующей версии уже не работает
пример передачи массивов в функцию, с возвратом значений, как обычно, инфы ноль, делал на основе экспериментов
// в MQL4 нельзя передать ссылочные переменные, надо делать их &массивом[]
// все переменные - массивы длиной 1
CODLL_EXPFUNC int __stdcall dll_GetCommandOrderSend(int cmdID[], MqlStr symbol[], int cmd[], double volume[], double price[],
int slippage[], double stoploss[], double takeprofit[], MqlStr comment[], int magic[], datetime expiration[], color arrow_color[])
{
cmdID[0] = 123;
symbol[0].string = "EURUSD";
а, забыл, это код в длл
вот импорт из MQL4
int dll_GetCommandOrderSend(int& cmdID[], string& symbol[], int& cmd[], double& volume[], double& price[], int& slippage[], double& stoploss[], double& takeprofit[],
string& comment[], int& magic[], datetime& expiration[], color& arrow_color[]);
в си/си++ это будет бредом, в MQL4 только так и работает
если я что-то упустил, поправьте плз
Спасибо, понятно. А как происходит округление? Просто отбрасываются знаки после запятой или так как принято в математики
в ситуации с присвоением double на int - произойдет именно отбрасывание.
int ticket1=OrderSend(Para,OP_BUY,Lots,Ask,15,SL,TP); - ну тут всё понятно
теперь ticket1 принимает значение 1 и выполняеться ета штука
if (ticket1>=0) - так как условие истинное то выполняеться внутреняя часть
OrderSelect(0, SELECT_BY_POS); - а вот здесь немагу понять почему мы указуем index=0 ...если пазиция первая открыта то ана далжнаш быть под номером 1.. или как??
и вот здесь OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),15); - тоесть как я понял OrderTicket() берёт номер тикета таво ордера каторый был указан в условии if... также и OrderLots() кол-во лотав берёться с етава тикета, а вот OrderClosePrice() тоесть как я понял он принимает значения Цены закрытия ордера.. но мы ведь неуказывали цену закрытия, стоплос да... но.......
Разьясни плиз
Подскажите плиз - почему неоткрываеться Третий ордер!?
double SLBak = 0.0, TPBak = 0.0, SLBak1 = 0.0;
int start()
{
//----
double Lots1=0.01;
double Lots2=0.02;
double Lots3=0.04;
double SL;
double TP;
string Para=Symbol();
int a, ticket1;
//----
SL=Bid -10*Point;
TP=Bid +10*Point;
if(OrdersTotal() == 0) {
if(TPBak <= Ask) {
ticket1=OrderSend(Para,OP_BUY,Lots1,Ask,15,SL,TP);
if(GetLastError() == 0){TPBak = TP; SLBak = SL; }
Print("OrderSend: ",GetLastError()," TPBak = ", TPBak, " TP = ", TP, " SLBak = ", SLBak, " SL = ",SL);
}
if(SLBak >= Bid ) {
ticket1=OrderSend(Para,OP_BUY,Lots2,Ask,15,SL,TP);
if(GetLastError() == 0){TPBak = TP; SLBak1 = SL; }
Print("OrderSend: ",GetLastError()," TPBak = ", TPBak, " TP = ", TP, " SLBak = ", SLBak, " SL = ",SL);
}
if(SLBak1 >= Bid ) {
ticket1=OrderSend(Para,OP_BUY,Lots3,Ask,15,SL,TP);
if(GetLastError() == 0){TPBak = TP; SLBak = SL; }
Print("OrderSend: ",GetLastError()," TPBak = ", TPBak, " TP = ", TP, " SLBak = ", SLBak, " SL = ",SL);
RefreshRates() должен спасти Вас.
Папробывал вписать RefreshRates()... да и куда тока не пробывал ево втыкнуть и максимум чево смог дабиться так ето что действительно открываеться третий ордер.... но и вместе с ним и первый и второй, короче говоря выходит каша :(
Немогли бы Вы показать куда ево нужно вписать и почему именно туда!?
Заранее благодарен.
Нет, еще раз посмотрел, обновление Вам не поможет.
Исходя из Вашей логики, при запуске сразу открывается ордер. Далее, если ордер закрылся в плюс и цена пошла в вверх больше ордера открываться не будут.
Если цена пошла вниз, то откроется удвоенный ордер.
Если ордер закрылся в минус и цена пошла вниз, ордера открываться не будут, только если цена пошла вверх.
Потом история повторяется, так что шансы на открытие третьего ордера - 25%.
Нет, еще раз посмотрел, обновление Вам не поможет.
Исходя из Вашей логики, при запуске сразу открывается ордер. Далее, если ордер закрылся в плюс и цена пошла в вверх больше ордера открываться не будут.
Если цена пошла вниз, то откроется удвоенный ордер.
Если ордер закрылся в минус и цена пошла вниз, ордера открываться не будут, только если цена пошла вверх.
Потом история повторяется, так что шансы на открытие третьего ордера - 25%.
Я хачу зделать чтобы - при старте открываеться первый ордер потом если тейкпрофит то он открываеться ещорз а если стоплос то открываеться второй ордер, если тейкпрофит то опять порядок збрасываеться и открываеться заново первый а если оптяь стоплос то открываеться третий... ну и если и тут стоплос ( тоесть он уже три раза выпал ) то порядак обнуляеться и всё с первава ордера начинаеться.
Мне кажеться что у меня должно открыться Три ордера по очереди если в первам стукнул стоплос - SLBak = SL - то он ссылаеться на открытие второго ордера - if(SLBak >= Bid ) - и если в етом ордере стукнул опять стоплос то он ссылаеться на открытие третьева - if(SLBak1 >= Bid )... но пачемуто действие недаходит до третьева :(
Если в первам ордере сработала переадресация на второй - SLBak = SL и действие перешло к if(SLBak >= Bid ). То почему второй не ссылаеться на третий - SLBak1 = SL на if(SLBak1 >= Bid ) ... :(