Вопросы по MQL4 - страница 7

 
Где то на форуме разработчики довольно подробно писАли о работе init/deinit. Может кто мог бы ссылку дать?
 
Все привет, вопрос такой:
Родил на дельфи DLLку, вызываю из МТ4. Все работает кроме передачи простых параметров по ссылке. В дельфи объявил так:

procedure Test2(var i: integer); stdcall;
begin
if addr(i) = nil then ShowMessage('Чо за батва?!');
end;

затычку для вызова так

#import "DLL1.dll"
void Test2(int& i);

вызываю так:
int init() {
int x = 5;
Test2(x);
return(x);
}

при вызове в стеке должна лежать ссылка на переменную integer, но там лежит null
так как передать int параметр по ссылке?
при передаче массивов, значение массива нормально передается по ссылке

использую
MetaEditor 4.00 build 183
MetaTrader 4.00 build 186

сразу еще вопрос: если передается строка как ссылке, то какого размера будет приемный буфер строки?

сразу еще вопрос:
Если я передаю строку как результат функции, то где должна быть выделена область памяти под строку? Я должен передавать указатель на глобальную переменную в DLL? При этом я могу быть уверен что DLL не будет вызываться из разных потоков одновременно при любом режиме работы метатрейдера?

Заранее спасибо
 
нынешняя реализация такова, что по ссылке можно передавать параметры только в пределах одного исходного кода. исключение составляют массивы. если передать массив в длл, то можно менять значения его элементов и эти изменения будут доступны в вызывающей функции. то есть можно передавать совсем маленький массив.
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо
 
1) если передается строка как ссылке, то какого размера будет приемный буфер строки?

2) Если я передаю строку как результат функции, то где должна быть выделена область памяти под строку? Я должен передавать указатель на глобальную переменную в DLL? При этом я могу быть уверен что DLL не будет вызываться из разных потоков одновременно при любом режиме работы метатрейдера?

Заранее спасибо
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

Так и реализуешь, в нужное время ставишь отложенные ордера (это легко). И начинаешь проверять ордера. Как только появился ордер Бай или Селл, отрабатываешь удаление отложенного ордера (это еще легче). И потом, в нужное время, отрабатывашь закрытие всех ордеров (это совсем просто).
 
Как в MQL4 реализовать такое
в начале дня устанавливаем два отложенных ордера
После того как один(любой) сработал - второй удаляется
За пять минут до закрытия бара(допустим дневного) закрыть сработавший (если он не был закрыт по SL или TP)
Если ни один отложенный ордер не соработал то за пять минут до закрытия бара удаляем их обоих
Заранее спасибо

Так и реализуешь, в нужное время ставишь отложенные ордера (это легко). И начинаешь проверять ордера. Как только появился ордер Бай или Селл, отрабатываешь удаление отложенного ордера (это еще легче). И потом, в нужное время, отрабатывашь закрытие всех ордеров (это совсем просто).


Я просил работающий код(может кто-то реализовывал)
Все что я делал не работало...Как-то коряво обрабатывается odrerdelete
Еще вопрос иногда цена на данном инструменте замирает(тиков нет) в течении нескольких минут т.е. нет возможности закрыть ордер т.к. тело int start() не выполняется, хотя по другим парам тики поступают нельзя ли как-нибудь передавать значение Curetime от любого инструмента где тики приходят
Проще говоря чтобы значение Curetime практически не зависало
 
То, что ты хочешь сделать - это азбука. Не поняв, как работают основные операторы, нельзя лезть вглубь. А закрывать все ордера можно из любого графика. Можно и так:
 cnt=0; 
   while(cnt<1) 
    { 
    if(OrdersTotal()<1)break;                          
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=OrderType(); 
    for(z=0;z<3;z++) 
     { 
     RefreshRates(); 
     if(cmd==2||cmd==3||cmd==4||cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); 
     if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); 
     if(result) break;Sleep(1000); 
     } 
    Sleep(10000); 
    }
 
То, что ты хочешь сделать - это азбука. Не поняв, как работают основные операторы, нельзя лезть вглубь. А закрывать все ордера можно из любого графика. Можно и так:
 cnt=0; 
   while(cnt<1) 
    { 
    if(OrdersTotal()<1)break;                          
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    cmd=OrderType(); 
    for(z=0;z<3;z++) 
     { 
     RefreshRates(); 
     if(cmd==2||cmd==3||cmd==4||cmd==5)result=OrderDelete(OrderTicket()); 
     if(cmd==0) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_BID),5,CLR_NONE); 
     if(cmd==1) result=OrderClose(OrderTicket(),OrderLots(),MarketInfo(OrderSymbol(),MODE_ASK),5,CLR_NONE); 
     if(result) break;Sleep(1000); 
     } 
    Sleep(10000); 
    }



И что делает сей кусок кода?
Удаляет оба еще не сработавших отложенных ордера
 
Ты же просил, чтобы за пять минут до закрытия бара уничтожать все ордера, вот он и снимет все. Только время ему задай правильно. А другие куски кода используй, чтобы закрывать ненужные ордера. Или ты хочешь, чтобы за тебя всю программу полностью написали?