Как кодировать? - страница 115

 
matrixebiz:
Не делаю ли я то же самое, поступая следующим образом?

if (Hour() 17) TradeHour = false;

То есть, если час находится между 12 и 17, то TradeHour = true, верно?

(Добавление && TradeHour в мое заявление о покупке/продаже)

Отрицание следующего утверждения:

if(Hour()>=12 && Hour()<17)

TradingEnabled=true;

[/CODE]

is

[CODE]

if(Hour()=17)

TradingEnabled=false;

 

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

Спасибо

 
matrixebiz:
Еще одна вещь как мне добавить в код задержку повторного входа, чтобы если сделка была только что открыта и закрыта, подождать 60 минут, а затем снова проверить, если торговые условия все еще выполняются. Спасибо

Не совсем понятно, что вы хотите.

Вы хотите, чтобы между проверкой торгового состояния и следующей проверкой прошло 60 минут?

Если это ваш запрос, то, возможно, это должно работать:

// Global variable

bool TradingEnabled = true; // flag to enable/disabled trading logic

bool TradingCheckDone = false; // flag to know if a a check was just done

datetime LastCheckTime = 0; // Time when the last check was done

.... somewhere in EA start() function ....

if( !TradingCheckDone )

{

// Default: We assume that trading logic must run ...

TradingEnabled = true;

// ... but only between 12:00:00 and 16:59:59

if(Hour()=17)

TradingEnabled=false;

// We must remember a check was just done

TradingCheckDone = true;

// We must even know when it was done

LastCheckTime = TimeCurrent();

} else

{

// if a hour has passed since the last check, it's time to retry

if( TimeCurrent() - LastCheckTime >= 3600 )

{

TradingCheckDone = false;

}

}

 
gorgoroth:
Не совсем понятно, что вы просите.

Хотите ли вы ждать 60 минут между проверкой торгового состояния и следующей проверкой?

Если это ваша просьба, то, возможно, это должно работать:

// Global variable

bool TradingEnabled = true; // flag to enable/disabled trading logic

bool TradingCheckDone = false; // flag to know if a a check was just done

datetime LastCheckTime = 0; // Time when the last check was done

.... somewhere in EA start() function ....

if( !TradingCheckDone )

{

// Default: We assume that trading logic must run ...

TradingEnabled = true;

// ... but only between 12:00:00 and 16:59:59

if(Hour()=17)

TradingEnabled=false;

// We must remember a check was just done

TradingCheckDone = true;

// We must even know when it was done

LastCheckTime = TimeCurrent();

} else

{

// if a hour has passed since the last check, it's time to retry

if( TimeCurrent() - LastCheckTime >= 3600 )

{

TradingCheckDone = false;

}

}

Нет, только если сделка только что произошла и закрылась, тогда я хочу, чтобы советник подождал час, затем проверил, выполнены ли еще торговые условия, если да, то хорошо, торгуйте снова, но если нет, то так тому и быть. Этот код будет делать то, что я хочу? Будет ли это работать в тестере из-за проверки TimeCurrent?

EDIT: не каждый час делать проверку сразу после закрытия сделки, затем ждать час для проверки условия и все. Затем, если в течение дня будет создана и закрыта еще одна сделка, то снова подождите час и если нет сигнала, то все, больше никаких проверок ожидания до следующего открытия и закрытия сделки.

Спасибо

Во вложении небольшой советник, если вы можете изменить его с правильными настройками, которые я упомянул. Спасибо

Файлы:
ozfx_method.mq4  11 kb
 

Buy_Limit и Buy_Stop

В чем разница между лимитным и стоп-ордером?

Спасибо

 
gorgoroth:
Всем привет,

Я разработал набор функций для управления настройками конфигурации из эксперта.

Эти функции экспортируются c++ DLL, и каждая из экспортируемых функций имеет конвекцию вызова __stdcall, запрошенную моим MQL4.

Моя проблема возникает, когда функция должна вернуть советнику строку.

Естественно, функция не может:

- возвращать указатель на локальную переменную (переменная выходит из области видимости)

- возвращать указатель на глобальную переменную dll (проблемы с одновременным доступом)

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

Поэтому я решил передавать строку и размер строки из советника. Es:

string buffer;

GetString( buffer, 30 );

[/CODE]

and from the c++ dll, something like this

void __stdcall GetString( LPTSTR buffer, int BufSize )

{

// Read a string from a some source

....

// -1 to take into account the terminating null character

StringCchCopy( buffer, BufSize-1, ReadStringFromASource );

}

[/CODE]

Here starts the weird behaviour of MQL managing strings returned from a DLL.

using the following code:

string buffer;

GetString( buffer, 30 );

the first time buffer contains the right string. A first question arises: buffer is not initialized but after calling GetString it contains the string returned. I have to suppose that MQL allocates space for a string variable when it's declared.

Next time GetString() is called the string returned seems to be truncated to the length-1 of the previous string length and not resetted as expected because of the 'string buffer;' statement.

Tried even:

[CODE]

string buffer = " "; // 'allocate' 30 blank characters

GetString( buffer, StringLen(buffer) );

but after the first time, when the execution returns to this code, the assignment of buffer does not work any more and buffer still contains the previous read string, and it seems it can only contains the number of characters of his content.

At first I have thought that the null character is not handled very well by MQL and modified the c++ code like this ...

[CODE]

CopyMemory( buffer, ReadStringFromASource, min(BufferSize,ReadStringFromASourceLength) );

и не добавлять завершающий нулевой символ.

Но при вызове из MQL не возвращается вообще никакой строки.

Есть ли у кого-нибудь ответ?

Ни у кого нет проблем с возвратом строки из DLL?

 

Мне нужна помощь...

Кто-нибудь может показать мне код, который можно прикрепить к моему советнику?

Один ордер на сигнал... потому что иногда у меня есть 3 сигнала из-за разных ТФ. Я хочу, чтобы все сигналы открывались...

или код, который будет принимать по одному ордеру на бар, но каждый таймфрейм прикреплять к одному советнику... не хочу открывать много графиков...

 

Что не так с моим BuyStop?

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Distance*Point,Slippage,Bid-Distance-StopLoss*Point,Ask+Distance+TakeProfit*Point,"",MagicNumber,0,Blue);

 
matrixebiz:
Что не так с моим BuyStop?

ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Ask+Distance*Point,Slippage,Bid-Distance-StopLoss*Point,Ask+Distance+TakeProfit*Point,"",MagicNumber,0,Blue);

стоп-лосс и тейк-профит.

вы также должны добавить * пункт к вашей дистанции перед добавлением...

ИЛИ

Бид-((Расстояние-СтопЛосс)*пункт),Аск+((Расстояние+ТейкПрофит)*пункт)