Помощь в кодировании - страница 483

 

Вы действительно звезда. Я люблю торговать, но без вашей помощи это было бы невозможно. Еще раз спасибо

 
xtractalpha:
Привет,

Не мог бы кто-нибудь помочь мне с моей функцией LotsizeCalc().

Я хотел бы умножить свой лот на 'MartingaleAmount', если моя последняя сделка была проигрышной. Если моя последняя сделка была выигрышной, я хотел бы использовать "нормальный" размер лота. К сожалению, при бэктесте советника я получаю ошибку 4051 из журнала.

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

Кто-нибудь знает, почему моя функция определения размера лота не работает?

Заранее спасибо,

Тьерри

extern int MaximumTrades = 10; extern double StopLoss=25; extern double TakeProfit=50; extern double MartingaleAmount = 1.5; input double LotSize=0.1; int magic; double pips; int tradeNumber; string ScreenComment; double martinlot; double martinsize;

[/PHP]

double LotsizeCalc() { if(OrderSelect(lastTradeTicket(),MODE_HISTORY)) if(OrderProfit()<0 && tradeNumber 0){ if(OrderSelect(ticket,SELECT_BY_TICKET)){ sl = OrderOpenPrice()+(StopLoss*pips); if(StopLoss==0)sl=0; tp = OrderOpenPrice()-(TakeProfit*pips); if(OrderType()==OP_BUY){ sl = OrderOpenPrice()-(StopLoss*pips); if(StopLoss==0)sl=0; tp = OrderOpenPrice()+(TakeProfit*pips); } if(!OrderModify(ticket,price,sl,tp,0,Magenta)) { err = GetLastError(); Print("Encountered an error during modification!"+(string)err+" "+ErrorDescription(err) ); } } else{//in case it fails to select the order for some reason Print("Failed to Select Order ",ticket); err = GetLastError(); Print("Encountered an error while seleting order "+(string)ticket+" error number "+(string)err+" "+ErrorDescription(err) ); } } else{//in case it fails to place the order and send us back a ticket number. err = GetLastError(); Print("Encountered an error during order placement!"+(string)err+" "+ErrorDescription(err) ); if(err==ERR_TRADE_NOT_ALLOWED)MessageBox("You can not place a trade because \"Allow Live Trading\" is not checked in your options. Please check the \"Allow Live Trading\" Box!","Check Your Settings!"); } }

Тьерри

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

[PHP]double lastOrderProfit(int magicNumber=0)

{

datetime lastTime = 0;

double lastProfit = 0;

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

{

if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY)==false) break;

if (magicNumber!=0)

if (OrderMagicNumber() != magicNumber) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderCloseTime() <= lastTime) continue;

lastTime = OrderCloseTime();

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

}

return(lastProfit);

}

Просто проверьте результат функции lastOrderProfit(), и если он < 0, то примените ваше правило мартингейла.

 

Привет, Младен! Снова я...

Как можно использовать линии из этого индикатора в советнике, использующем iCustom, так как, похоже, нет никаких буферов, установленных для этих линий?

Спасибо

Файлы:
 
Jason2005:
Привет, Младен! Я снова...

Как можно использовать линии этого индикатора в советнике, использующем iCustom, поскольку для этих линий, похоже, не установлены буферы?

Спасибо

Это объекты.

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

 
mladen:
Это объекты. Вы можете обращаться к объектам по имени (вы должны знать точное имя объекта, но индикатор должен быть активен на графике и эти объекты должны быть нарисованы на графике).

Отлично. Так как же мне вызвать индикатор из советника? С помощью чего-то другого, кроме iCustom, или я все неправильно понял... Спасибо mladen

 
Jason2005:
Отлично. Как же мне вызвать индикатор из советника? С помощью чего-то другого, кроме iCustom, или я что-то напутал... Спасибо mladen

Этот индикатор просто рисует уровни на уровне 0,20,50,80 пунктов каждого отрезка в 100 пунктов. Самый простой способ - проверить, пересекаются ли эти уровни вашим советником.

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

 
mladen:
Этот индикатор просто рисует уровни на 0,20,50,80 пипсах каждого отрезка в 100 пипсов. Самый простой способ - проверить, пересекаются ли эти уровни из вашего советника. Если вы попробуете использовать названия объектов (и их цены, вы не сможете узнать точные названия линий, поскольку они зависят от самого высокого максимума и самого низкого минимума - они являются предметом изменений. Используйте режим, описанный выше

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

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

Джейсон2005

У вас есть код, как это делается в индикаторе, который вы прикрепили.

 
mladen:
Jason2005 У вас есть код, как это делается в индикаторе, который вы прикрепили

Тогда это будет так?

MathMod(i, 5) == 0.0
 
mladen:
Тьерри

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

double lastOrderProfit(int magicNumber=0)

{

datetime lastTime = 0;

double lastProfit = 0;

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

{

if (OrderSelect(i,SELECT_BY_POS, MODE_HISTORY)==false) break;

if (magicNumber!=0)

if (OrderMagicNumber() != magicNumber) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderCloseTime() <= lastTime) continue;

lastTime = OrderCloseTime();

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

}

return(lastProfit);

}

Просто проверьте результат функции lastOrderProfit(), и если он < 0, то примените ваше правило мартингейла.


Привет, Младен,

Спасибо за ваш ответ.

Функция lastorderprofit не нужна, потому что моя функция lastTradeTicket() делает ту же работу.

Не могли бы вы взглянуть на мой советник?

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

Заранее спасибо,

Тьерри

53_martingale.mq4

Файлы: