Universal MA Cross EA - страница 106

 
BlackCoq:
Дело в том, что я использую очень похожий код для системы мартингейла, который отлично работает: Раз он работает для мартингейла, не должен ли он работать и сейчас?

Попробуйте использовать что-то вроде этого:

double GetLastPL()

{

double TempLastOrderProfit = 0;

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

{

CloseTime = OrderCloseTime();

TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission();

}

}

return(TempLastOrderProfit);

}

Это вернет вам точную сумму прибыли (или убытка) последнего ордера.

 
mladen:
Попробуйте использовать что-то вроде этого: Это вернет вам точную сумму прибыли (или убытка) последнего ордера

Спасибо за помощь, Младен. Я немного подправил код, пока не добился его компиляции без ошибок, но советник все равно останавливается и разворачивается после убытка. Вот точный код, который я использую сейчас:

{

double TempLastOrderProfit = 0;

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

{

CloseTime = OrderCloseTime();

}

}

if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0)

{

if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true))

{

subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !");

}

}

}

double GetLastPL() Выдает следующую ошибку: '(' - определение функции неожиданно.

 
BlackCoq:
Спасибо за помощь, Младен. Я немного подправил код, пока не добился его компиляции без ошибок, но советник все равно останавливается и разворачивается после убытка. Вот точный код, который я использую сейчас: double GetLastPL() Выдает следующую ошибку: '(' - определение функции неожиданно.

BlackCoq

Вы должны делать все логические сравнения внутри цикла, потому что функции типа OrderProfit() возвращают прибыль текущего выбранного ордера из списка закрытых ордеров. Если это не внутри основного цикла (for(int i=OrdersHistoryTotal()-1;i>=0;i--)), то будет проверен только последний выбранный ордер, и это не означает, что он последний (metaquotes явно указывает в своей документации, что ордера в списке закрытых (или еще открытых) ордеров не обязательно должны быть в каком-то определенном порядке - это ответственность кодеров за проверку порядка).

 
mladen:
BlackCoq Вы должны делать все логические сравнения внутри цикла, потому что функции типа OrderProfit() возвращают прибыль текущего выбранного ордера из списка закрытых ордеров. Если это не внутри основного цикла (for(int i=OrdersHistoryTotal()-1;i>=0;i--)), то будет проверен только последний выбранный ордер, и это не означает, что он последний (в документации metaquotes явно указано, что ордера в списке закрытых (или еще открытых) ордеров не обязательно должны быть в каком-то определенном порядке - это ответственность кодеров за проверку порядка).

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

Когда я попробовал это, советник вообще не открыл ни одной позиции:

{ double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); } } { if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

And with this, it would "stop and reverse" even if last trade was a loss:

[PHP] { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }

Еще раз спасибо.

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

Когда я попробовал это сделать, советник вообще не открыл ни одной позиции:

{ double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); } } { if(StopAndReverse==true && subTotalTrade()>0 && OrderProfit()>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

And with this, it would "stop and reverse" even if last trade was a loss:

[PHP] { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }
Еще раз спасибо.

BlackCoq

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

 
mladen:
BlackCoq Если вы используете функцию, которую я выложил, как есть, она вернет вам точную прибыль последнего закрытого ордера (не нужно ничего в ней менять)

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

Этот код:

{

double GetLastPL()

{

double TempLastOrderProfit = 0;

datetime CloseTime = 0;

for(int i=OrdersHistoryTotal()-1;i>=0;i--)

{

if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))

if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime)

{

CloseTime = OrderCloseTime();

TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission();

}

}

return(TempLastOrderProfit);

{

if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0)

{

if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true))

{

subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !");

}

}

}

}

Выдает ошибки:

Compiling 'universalMAcrossECNmartingaleSAR.mq4'...

'(' - неожиданное определение функции (538, 20)

'TempLastOrderProfit' - переменная не определена (548, 15)

'TempLastOrderProfit' - переменная не определена (551, 15)

'TempLastOrderProfit' - переменная не определена (553, 52)

 
BlackCoq:
Когда я пытаюсь скопировать функцию, я получаю множество ошибок, независимо от того, как я пытаюсь ее настроить.

Этот код:

{ double GetLastPL() { double TempLastOrderProfit = 0; datetime CloseTime = 0; for(int i=OrdersHistoryTotal()-1;i>=0;i--) { if (OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderCloseTime()>CloseTime) { CloseTime = OrderCloseTime(); TempLastOrderProfit = OrderProfit() + OrderSwap()+ OrderCommission(); } } return(TempLastOrderProfit); { if(StopAndReverse==true && subTotalTrade()>0 && TempLastOrderProfit>0) { if((LastTrade=="BUY" && SellCondition==true) || (LastTrade=="SELL" && BuyCondition==true)) { subCloseOrder(); if(subTotalTrade()>0) subCloseOrder(); if(subTotalTrade()>0) subCloseOrder();

if(IsTesting() && PrintControl==true) Print("STOP AND REVERSE !"); } } } }[/PHP]

Gives me the errors:

[PHP]

Compiling 'universalMAcrossECNmartingaleSAR.mq4'... '(' - function definition unexpected (538, 20)'TempLastOrderProfit' - variable not defined (548, 15)'TempLastOrderProfit' - variable not defined (551, 15)'TempLastOrderProfit' - variable not defined (553, 52)

BlackCoq

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

Файлы:
 
mladen:
BlackCoq Эта функция должна быть вставлена вне любой другой функции. Вот очень простой пример, который показывает, как она работает и как ее следует использовать

Я уверен, что я что-то упускаю, но даже если я пытаюсь скопировать функцию вне любой другой функции в советнике, я все равно получаю следующие ошибки:

'(' - определение функции неожиданно (после double GetLastPL())

'TempLastOrderProfit' - переменная не определена (554, 15)

'TempLastOrderProfit' - переменная не определена (557, 15)

 
BlackCoq:
Я уверен, что я что-то упускаю, но даже если я пытаюсь скопировать эту функцию вне любой другой функции в советнике, я все равно получаю следующие ошибки:

'(' - неожиданное определение функции (после double GetLastPL())

'TempLastOrderProfit' - переменная не определена (554, 15)

'TempLastOrderProfit' - переменная не определена (557, 15)

Сори, но без вашего кода я понятия не имею, что вы делаете.

Как вы можете видеть из этого тестового советника, он работает без проблем.

 
mladen:
Сори, но без вашего кода я понятия не имею, что вы делаете. Как вы можете видеть из этого тестового советника, он работает без проблем.

Я также получаю несколько ошибок, когда пытаюсь скомпилировать советник, который вы приложили. Мы используем разные версии MT4?

Я прикрепляю советник, к которому я пытаюсь добавить функцию перед "стоп и реверс".

Файлы:
Причина обращения: