Вопрос к профессионалам: ООП и MQL4 - страница 5

 
andreybs:

Очень простое - передать 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";

 
sergeev:

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


Спасибо, понятно. А как происходит округление? Просто отбрасываются знаки после запятой или так как принято в математики
 
VDev:

по указателям нельзя, можно по ссылкам, но они какие-то в 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 только так и работает

если я что-то упустил, поправьте плз

 
VladimirR:
Спасибо, понятно. А как происходит округление? Просто отбрасываются знаки после запятой или так как принято в математики

в ситуации с присвоением 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() должен спасти Вас.
 
Roger:
RefreshRates() должен спасти Вас.


Папробывал вписать RefreshRates()... да и куда тока не пробывал ево втыкнуть и максимум чево смог дабиться так ето что действительно открываеться третий ордер.... но и вместе с ним и первый и второй, короче говоря выходит каша :(

Немогли бы Вы показать куда ево нужно вписать и почему именно туда!?

Заранее благодарен. 

 

Нет, еще раз посмотрел, обновление Вам не поможет.

Исходя из Вашей логики, при запуске сразу открывается ордер. Далее, если ордер закрылся в плюс и цена пошла в вверх больше ордера открываться не будут.

Если цена пошла вниз, то откроется удвоенный ордер.

Если ордер закрылся в минус и цена пошла вниз, ордера открываться не будут, только если цена пошла вверх.

Потом история повторяется, так что шансы на открытие третьего ордера - 25%.

 
Roger:

Нет, еще раз посмотрел, обновление Вам не поможет.

Исходя из Вашей логики, при запуске сразу открывается ордер. Далее, если ордер закрылся в плюс и цена пошла в вверх больше ордера открываться не будут.

Если цена пошла вниз, то откроется удвоенный ордер.

Если ордер закрылся в минус и цена пошла вниз, ордера открываться не будут, только если цена пошла вверх.

Потом история повторяется, так что шансы на открытие третьего ордера - 25%.

Я хачу зделать чтобы - при старте открываеться первый ордер потом если тейкпрофит то он открываеться ещорз а если стоплос то открываеться второй ордер, если тейкпрофит то опять порядок збрасываеться и открываеться заново первый а если оптяь стоплос то открываеться третий... ну и если и тут стоплос ( тоесть он уже три раза выпал ) то порядак обнуляеться и всё с первава ордера начинаеться.

Мне кажеться что у меня должно открыться Три ордера по очереди если в первам стукнул стоплос - SLBak = SL -  то он ссылаеться на открытие второго ордера - if(SLBak >= Bid ) - и если в етом ордере стукнул опять стоплос то он ссылаеться на открытие третьева - if(SLBak1 >= Bid )... но пачемуто действие недаходит до третьева :(

Если в первам ордере сработала переадресация на второй -  SLBak = SL и действие перешло к if(SLBak >= Bid ). То почему второй не ссылаеться на третий - SLBak1 = SL на if(SLBak1 >= Bid ) ... :(

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