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

 

еще один вопрос новичка

Привет, я новичок в программировании, но не новичок в трейдинге. Некоторое время я ничего не писал, а теперь, когда я начал разрабатывать своего советника, у меня появилось много вопросов. Сначала я начал с создания индикатора, а когда он будет делать то, что я хочу, я пойду дальше. Я прочитал все руководства, которые смог найти, так что теперь пришло время перейти к кодированию.

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

У меня 2, наверное, основных вопроса на данный момент, пожалуйста:

1. Во многих индикаторах, использующих МА, я вижу линии, проверяющие количество баров на графике. Так вот, если мне нужна MA200, а на графике всего, скажем, 100 баров, будет ли тогда работать iMA200? Думаю, да - я проверял, и любая MA рисуется без проблем на любом графике, так что, думаю, это старая ошибка, которую Metaquotes сейчас исправила. Итак, есть ли смысл проверять, сколько баров на графике для построения МА или использования функции iMA?

2. В чем разница между Close и iClose? Насколько я понимаю, Close может вернуть закрытие баров только на текущем графике, а iClose может вернуть любое закрытие любой валютной пары и любого таймфрейма. И в обоих случаях, чтобы получить последний закрытый бар, я должен использовать индекс [1]. Правильно ли я понимаю?

Спасибо.

 

Я уже сделал это. См. выделенное красным ниже:

//--- Определяем, является ли предыдущий ордер на продажу прибыльным

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}

Все еще совершенно пусто.

Почесываю голову. Я знаю, что ваша помощь ограничена, потому что я не вставил код, но, по-вашему, вышеприведенный код выглядит нормально?

Также в первой строке ниже, нужно ли мне ссылаться на LastOpenTicket с () после?

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

 

...

Если вы вызываете эту функцию с номером последнего открытого билета в качестве аргумента, то код после синей линии никогда не будет выполнен (OrderSelect() терпит неудачу, если номер LastOpenTicket равен -1 (что в этот момент эквивалентно результату функции LastOpenTicket()), и код не попадает на выполнение блока после синей линии)

crsnape@btinternet.com:
Я уже сделал это. См. выделенное красным ниже:

//--- Определить, является ли предыдущий ордер на продажу прибыльным

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

}

Все еще совершенно пусто.

Почесываю голову. Я знаю, что ваша помощь ограничена, потому что я не вставил код, но, по-вашему, вышеприведенный код выглядит нормально?

Также в первой строке ниже, нужно ли мне ссылаться на LastOpenTicket с () после?

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)
 

Я не уверен, что понимаю.

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

Так как я вызываю функцию LastOpenTicket() в строке выше, остальная часть этой функции не выполняется и OrderSelect() не работает. Правильно ли я вас понял?

 

...

Предположим следующее:

- у вас не было предыдущих ордеров

- LastOpenedTicket() вернула -1 (нет предыдущих заказов) в качестве результата

- вы вызываете функцию с этим результатом

OrderSelect() терпит неудачу, так как билет ордера -1 не существует, и ни один из кодов, стоящих за выбором ордера, не выполняется. Даже в случае, когда LastOpenTicket > -1, "условие синей линии", что LastOpenTicket() == -1, никогда не может быть истинным, поскольку единственный способ добраться до этой части кода - это когда LastOpenTicket > -1.

Вот почему я предложил "3-е состояние : "На", поскольку на самом деле у вас есть 3 состояния из-за начального состояния "нет предыдущих ордеров"

crsnape@btinternet.com:
Я не уверен, что понимаю.

if ((OrderProfit() < 0 && OrderType() == OP_SELL) || LastOpenTicket() == -1)

Так как я вызываю функцию LastOpenTicket() в строке выше, остальная часть этой функции не выполняется и OrderSelect() не работает. Правильно ли я вас понял?
 

несколько вопросов по кодированию, возможно, для начинающих

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

Буду благодарен за любой совет - вы все начинали там, где я сейчас...

У меня 2, наверное, основных вопроса на данный момент, пожалуйста:

1. В некоторых индикаторах, использующих МА, я вижу линии, проверяющие количество баров на графике. Так вот, если мне нужна МА200, а на графике всего, скажем, 100 баров, будет ли тогда работать iMA200? Думаю, да - я проверял, и любая MA рисуется без проблем на любом графике, так что, думаю, это старая проблема, которую Metaquotes сейчас исправила. Итак, есть ли смысл проверять, сколько баров на графике для построения МА или использования функции iMA?

2. В чем разница между Close и iClose? Насколько я понимаю, Close может вернуть закрытие баров только на текущем графике, а iClose может вернуть любое закрытие любой валютной пары и любого таймфрейма. И в обоих случаях, чтобы получить последний закрытый бар, я должен использовать индекс [1]. Правильно ли это?

Спасибо.

 

Например.

//--- Определите, является ли предыдущий ордер на продажу прибыльным

string GetWinLossPreviousShort (int LastOpenTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

if (LastOpenTicket() == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

}

ИЛИ ЭТО? изменяется красным цветом.

//--- Определяем, является ли предыдущий ордер на продажу прибыльным

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}

}

 

Я не могу использовать OrderSelect для номера билета, который равен -1, потому что -1 не существует. Билеты идут от 0 и выше.

Мне нужно объявить LastOpenTicket вне функции OrderSend, правильно?

 

...

Попробуйте вот так :

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

//

//

// if LastTicket == -1 no need even to try to execute the code bellow

// you already have exited for case when it is -1, so the code bellow

// will be executed properly

//

//

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}
 

Спасибо mladen, код ниже в основном равен тому же, что и ваш? Я напечатал это, когда вы опубликовали свой последний! :-)

EDITED-

//--- Определить, является ли предыдущий ордер на продажу прибыльным

string GetWinLossPreviousShort (int LastOpenTicket, int LastTicket, string WinLossPreviousShort)

{

if (OrderSelect(LastOpenTicket(), SELECT_BY_TICKET, MODE_TRADES) == TRUE)

{

if (OrderProfit() >= 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "W";

return (WinLossPreviousShort);

}

if (OrderProfit() < 0 && OrderType() == OP_SELL)

{

WinLossPreviousShort = "L";

return (WinLossPreviousShort);

}

}

if (LastTicket == -1)

{

WinLossPreviousShort = "NA";

return (WinLossPreviousShort);

}

}