Здравствуйте.
Подскажите где ошибка в коде.Есть несколько 3-5 открытых ордеров на покупку.При достижении общего профита в 1%-1,5%, нужно запомнить цену.И когда профит будет от 3-3,5% перевести стоплосс последнего ордера на запомненную цену в 1%.
В коде ниже советник работает, но переводит в без убыток в 2%.И в журнале ошибка 130 неправильные стопы и 4051 недопустимое значение параметра функции.Когда ошибка 130 переводит в безубыток, когда 4051 нет.
При достижении общего профита в 1%-1,5%, нужно запомнить цену.И когда профит будет от 3-3,5% перевести стоплосс последнего ордера на запомненную цену в 1%.
Функция NoLoss вам поможет !!
extern int NoLossStart = 10;
//-----------------------------+
int i,modify;
double Pp;
string Symb;
void init() {
Pp=Point;
Symb=Symbol();
return;
}
void start() {
double profit=0, buy_last_price= -1, sell_last_price= -1;
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
profit+=OrderProfit()+OrderSwap()+OrderCommission();
if(OrderType()==0) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}
if(OrderType()==1) {if(sell_last_price==-1) sell_last_price=OrderOpenPrice();}
}
//----------------------------------------------------------------------------------------------------------------------------------------+
for(i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
if(NoLossStart>0 && OrderType()==0 && profit>0 && NormalizeDouble(buy_last_price,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-NoLossStart*Pp,Digits)>=NormalizeDouble(buy_last_price,Digits))
modify=OrderModify(OrderTicket(),OrderOpenPrice(),buy_last_price+NoLoss*Pp,OrderTakeProfit(),0,DarkGray);
if(NoLossStart>0 && OrderType()==1 && profit>0 && (NormalizeDouble(sell_last_price,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+NoLossStart*Pp,Digits)<=NormalizeDouble(sell_last_price,Digits))
modify=OrderModify(OrderTicket(),OrderOpenPrice(),sell_last_price-NoLoss*Pp,OrderTakeProfit(),0,DarkGray);
}
Функция NoLoss вам поможет !!
extern int NoLossStart = 10;
//-----------------------------+
int i,modify;
double Pp;
string Symb;
void init() {
Pp=Point;
Symb=Symbol();
return;
}
void start() {
double profit=0, buy_last_price= -1, sell_last_price= -1;
for(i=OrdersTotal()-1;i>=0;i--) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
profit+=OrderProfit()+OrderSwap()+OrderCommission();
if(OrderType()==0) {if(buy_last_price==-1) buy_last_price=OrderOpenPrice();}
if(OrderType()==1) {if(sell_last_price==-1) sell_last_price=OrderOpenPrice();}
}
//----------------------------------------------------------------------------------------------------------------------------------------+
for(i=0;i<OrdersTotal();i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Symb && OrderMagicNumber()==Magic) {
if(NoLossStart>0 && OrderType()==0 && profit>0 && NormalizeDouble(buy_last_price,Digits)>NormalizeDouble(OrderStopLoss(),Digits)
&& NormalizeDouble(Bid-NoLossStart*Pp,Digits)>=NormalizeDouble(buy_last_price,Digits))
modify=OrderModify(OrderTicket(),OrderOpenPrice(),buy_last_price+NoLoss*Pp,OrderTakeProfit(),0,DarkGray);
if(NoLossStart>0 && OrderType()==1 && profit>0 && (NormalizeDouble(sell_last_price,Digits)<NormalizeDouble(OrderStopLoss(),Digits) || OrderStopLoss()==0)
&& NormalizeDouble(Ask+NoLossStart*Pp,Digits)<=NormalizeDouble(sell_last_price,Digits))
modify=OrderModify(OrderTicket(),OrderOpenPrice(),sell_last_price-NoLoss*Pp,OrderTakeProfit(),0,DarkGray);
}
Спасибо.
В коде переписал две строчки, ошибки исчезли.
double balans=StrToDouble(OrderComment());
{
double profit=NormalizeDouble(p*100/balans,1);//с такой записью нет ошибки в журнале 130 и 4051
if(profit>0.2 && profit<0.6) double odinprocent=Bid;
}
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте.
Подскажите где ошибка в коде.Есть несколько 3-5 открытых ордеров на покупку.При достижении общего профита в 1%-1,5%, нужно запомнить цену.И когда профит будет от 3-3,5% перевести стоплосс последнего ордера на запомненную цену в 1%.
В коде ниже советник работает, но переводит в без убыток в 2%.И в журнале ошибка 130 неправильные стопы и 4051 недопустимое значение параметра функции.Когда ошибка 130 переводит в безубыток, когда 4051 нет.
//+------------------------------------------------------------------+
void modifTP()
{
double p=0; //профит всех ордеров
datetime o;
for (int i = 0; i < OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
{
if (OrderType()==OP_BUY || OrderType()==OP_SELL)
{
if (OrderMagicNumber()==Magic)
p+=OrderProfit(); //находим общий профит всех ордеров
{
if (o<OrderOpenTime())
{
o=OrderOpenTime(); //находим самый последний открытый ордер
double balans=AccountBalance();
{
if(p*100/balans>1 && p*100/balans<1.5)//относительно баланса находим интервал профита от 1% до 1,5%
double odinprocent=Bid; //запоминаем цену в данный момент
}
}
//------------------------------модификация ордера на покупку
if (OrderType() == OP_BUY)
{
if ( p*100/balans>=3 && p*100/balans<=3.5)//если профит ордеров от 3-3,5% то переносим стоплосс на запомненную цену в 1%
{
TP = NormalizeDouble(OrderOpenPrice()+0.03000,5);
SL = NormalizeDouble(odinprocent-0.00070,5);
OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
}
}
//------------------------------модификация ордера на продажу
if (OrderType() == OP_SELL )
{
if ( p*100/balans>=3 && p*100/balans<=3.5 )
{
TP = NormalizeDouble(OrderOpenPrice()-0.03000,5);
SL = NormalizeDouble(odinprocent+0.00070,5);
OrderModify(OrderTicket(), OrderOpenPrice(), SL, TP, 0);
}
}
}
}
}
}
}
}
//--------------------------------------------------------------------+
Через принт в журнале смотрел "odinprocent" показывает десятки разных цен в диапазоне от 1%-1,5%. Пробывал через цикл по времени найти самую последнюю цену, виснет.