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

 
arroganzmaschine:
Привет, Младен, еще один вопрос:

Как я могу проверить все открытые ордера, если их прибыль ниже -20, и закрыть их?

Что-то вроде этого?

//int currentTicket;

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

// currentTicket = OrderSelect(i0, SELECT_BY_POS, MODE_TRADES);

if(OrderProfit() <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

arroganzmaschine

Да, это должно помочь.

Вы можете изменить только строку, где вы проверяете прибыль, на эту :

if ((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

чтобы убедиться, что вы проверяете именно "чистую" прибыль.

 

Должен ли я устанавливать Bid или Ask в OrderClose? Или эта строка верна?

 

Хм, что-то не так. Бэктест не закрывает ордера, которые находятся в минусовой прибыли. В конце теста есть открытые ордера с прибылью -230.

 

int start()

{

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Это не работает.

 
arroganzmaschine:
int start()

{

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20) {

OrderClose(OrderTicket(),OrderLots(),0,0, CLR_NONE);

}

}

}

Это не работает.

Вы забыли OrderSelect() (вы всегда должны выбрать заказ, прежде чем что-то с ним делать). Также было бы неплохо добавить часть, которая проверяет, какой тип ордера вы пытаетесь закрыть.

Что-то вроде этого :

for(int i0=OrdersTotal()-1; i0>=0; i0--) {

if (OrderSelect(u0,SELECT_BY_POS,MODE_TRADES))

if((OrderProfit()+OrderSwap()+OrderCommission()) <= -20)

{

if (OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),Bid,0,CLR_NONE);

if (OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),Ask,0,CLR_NONE);

}

 

может ли кто-нибудь помочь мне с преобразованием гистограммы в бары в индикаторе TrendHistogram? Я хотел бы получить такие же бары, как в прилагаемом индикаторе TrendFilter.

Для корректной работы TrendHistogram необходим индикатор EMA_Adaptive

 
freakout:
может ли кто-нибудь помочь мне с преобразованием гистограммы в бары в индикаторе TrendHistogram? Я хотел бы получить такие же бары, как в прикрепленном индикаторе TrendFilter Для корректной работы TrendHistogram необходим индикатор EMA_Adaptive .

freakout

Вот, пожалуйста.

Установите параметр DrawAsBars в true, и он будет рисовать так, как вы описали. Если вы оставите этот параметр в false, то все будет работать как в оригинале.

Файлы:
 

Здравствуйте,

Может ли кто-нибудь помочь мне отредактировать этот код, бэк-тестирование хорошо, но советник не работает на демо / реальном счете.

//+------------------------------------------------------------------+

//| Hans123Trader v1 |

//+------------------------------------------------------------------+

#include

#property copyright "hans123"

#property link ""

// запрограммировано fukinagashi

extern int BeginSession1=6;(во время бэктеста я отредактировал и установил 0 для всех сессий, таким образом получив окончательные результаты)

extern int EndSession1=10;

extern int BeginSession2=10;

extern int EndSession2=14;

extern double TrailingStop = 0;

extern double TakeProfit = 452;

extern double InitialStopLoss = 40;

double Lots = 0.1;

datetime bartime = 0;

double Slippage=3;

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start()

{

int cnt, ticket, err, i, j, cmd;

int MagicNumber;

double ts, tp, LowestPrice, HighestPrice, Price;

bool Order[5];

строка setup;

datetime Validity=0;

if(IsTesting() && Bars<100) return(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Symbol();

if (bartime == Time[0]) {

return(0);

} else {

bartime = Time[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// МОДИФИКАЦИИ ПО ОТКРЫТЫМ ОРДЕРАМ ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Ошибка закрытия ордера на покупку [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Ошибка модификации ордера на покупку [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

if (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Ошибка закрытия ордера на продажу [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

if (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// УСТАНОВКА ОРДЕРОВ ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0);

Validity=StrToTime(TimeYear(Time[0]) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + " 23:59");

if (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//// следующее необходимо, чтобы избежать цены BUYSTOP/SELLSTOP, которая слишком близка к Bid/Ask,

//// в этом случае мы получим 130 недействительных стопов.

//// Я экспериментировал с изменением OP_BUY и OP_SELL, но результаты меня не удовлетворили.

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

//цена=Ask;

//} else {

cmd=OP_BUYSTOP;

Цена=ВысшаяЦена+5*Точка;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

//цена=бид;

//} else {

cmd=OP_SELLSTOP;

Цена=НизшаяЦена-5*Точка;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

//цена=Ask;

//} else {

cmd=OP_BUYSTOP;

Цена=ВысшаяЦена+5*Точка;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

//цена=бид;

//} else {

cmd=OP_SELLSTOP;

Цена=НизшаяЦена-5*Точка;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// РАЗНООБРАЗНЫЕ ПОДПРОГРАММЫ /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01);

} else if(symbol=="CHFJPY") { return(10);

} else if(symbol=="EURAUD") { return(10);

} else if(symbol=="EURCAD") { return(11);

} else if(symbol=="EURCHF") { return(12);

} else if(symbol=="EURGBP") { return(13);

} else if(symbol=="EURJPY") { return(14);

} else if(symbol=="EURUSDm") { return(15);

} else if(symbol=="GBPCHF") { return(20);

} else if(symbol=="GBPJPY") { return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") { return(40);

} else if(symbol=="USDCHF") { return(41);

} else if(symbol=="USDJPY") { return(42);

} else if(symbol=="GOLD") { return(90);

} else { Comment("unexpected Symbol"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime;

int timeout=30;

int ticket;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Ошибка в OrderSendExtended(): Timeout encountered");

return(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // устанавливаем индикатор блокировки

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // снимаем индикатор блокировки

return(ticket);

}

 
ccd:
Привет,

Может ли кто-нибудь помочь мне отредактировать этот код, бэк-тестирование хорошо, но советник не работает на демо / реальном счете.

//+------------------------------------------------------------------+

//| Hans123Trader v1 |

//+------------------------------------------------------------------+

#include

#property copyright "hans123"

#property link ""

// запрограммировано fukinagashi

extern int BeginSession1=6;(во время бэктеста я отредактировал и установил 0 для всех сессий, таким образом получив окончательные результаты)

extern int EndSession1=10;

extern int BeginSession2=10;

extern int EndSession2=14;

extern double TrailingStop = 0;

extern double TakeProfit = 452;

extern double InitialStopLoss = 40;

double Lots = 0.1;

datetime bartime = 0;

double Slippage=3;

//+------------------------------------------------------------------+

//| |

//+------------------------------------------------------------------+

int start()

{

int cnt, ticket, err, i, j, cmd;

int MagicNumber;

double ts, tp, LowestPrice, HighestPrice, Price;

bool Order[5];

строка setup;

datetime Validity=0;

if(IsTesting() && Bars<100) return(0);

MagicNumber = 50000 + func_Symbol2Val(Symbol())*100;

setup="H123_" + Symbol();

if (bartime == Time[0]) {

return(0);

} else {

bartime = Time[0];

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// МОДИФИКАЦИИ ПО ОТКРЫТЫМ ОРДЕРАМ ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

for(cnt=OrdersTotal();cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if(OrderType()==OP_BUY && (OrderMagicNumber()==MagicNumber+1 || OrderMagicNumber()==MagicNumber+3)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".");

OrderClose(OrderTicket(), Lots, Bid, 3, Red);

if (err>1) { Print("Ошибка закрытия ордера на покупку [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()+TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()-InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Ошибка модификации ордера на покупку [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Bid-Point*TrailingStop;

if (OrderStopLoss()0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

} else if(OrderType()==OP_SELL && (OrderMagicNumber()==MagicNumber+2 || OrderMagicNumber()==MagicNumber+4)) {

if(TimeDay(OrderOpenTime())!=TimeDay(Time[0])) {

Print(".");

OrderClose(OrderTicket(), Lots, Ask, 3, Red);

if (err>1) { Print("Ошибка закрытия ордера на продажу [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (OrderStopLoss()==0) {

if (TakeProfit>0) { tp=OrderOpenPrice()-TakeProfit*Point;

} else { tp=0; }

if (InitialStopLoss>0) { ts=OrderOpenPrice()+InitialStopLoss*Point;

} else { ts=0; }

OrderModify(OrderTicket(),OrderOpenPrice(),ts,tp,0,White);

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

} else if (TrailingStop>0) {

ts = Ask+Point*TrailingStop;

if (OrderStopLoss()>ts && OrderProfit()>0) OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,White);

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// УСТАНОВКА ОРДЕРОВ ////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if(AccountFreeMargin()<(1000*Lots)) return(0);

Validity=StrToTime(TimeYear(Time[0]) + "." + TimeMonth(Time[0]) + "." + TimeDay(Time[0]) + " 23:59");

if (TimeHour(Time[0])==EndSession1 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//// следующее необходимо, чтобы избежать цены BUYSTOP/SELLSTOP, которая слишком близка к Bid/Ask,

//// в этом случае мы получим 130 недействительных стопов.

//// Я экспериментировал с изменением OP_BUY и OP_SELL, но результаты меня не удовлетворили.

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

//цена=Ask;

//} else {

cmd=OP_BUYSTOP;

Цена=ВысшаяЦена+5*Точка;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+1,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

//цена=бид;

//} else {

cmd=OP_SELLSTOP;

Цена=НизшаяЦена-5*Точка;

//}

ticket=OrderSendExtended(Symbol(),OP_SELLSTOP,Lots,Price,Slippage,0,0,setup,MagicNumber+2,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

if (TimeHour(Time[0])==EndSession2 && TimeMinute(Time[0])==0) {

LowestPrice=Low[Lowest(NULL, PERIOD_M5, MODE_LOW, 80, 0)];

HighestPrice=High;

//if (HighestPrice+5*Point<Ask+Spread*Point) {

// cmd=OP_BUY;

//цена=Ask;

//} else {

cmd=OP_BUYSTOP;

Цена=ВысшаяЦена+5*Точка;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+3,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

//if (LowestPrice-5*Point>Bid-Spread*Point) {

// cmd=OP_SELL;

//цена=бид;

//} else {

cmd=OP_SELLSTOP;

Цена=НизшаяЦена-5*Точка;

//}

ticket=OrderSendExtended(Symbol(),cmd,Lots,Price,Slippage,0,0,setup,MagicNumber+4,Validity,Green);

err = GetLastError();

if (err>1) { Print("Error modifying Sell order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); }

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

///////////////// РАЗНООБРАЗНЫЕ ПОДПРОГРАММЫ /////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

int func_Symbol2Val(string symbol) {

if(symbol=="AUDUSD") { return(01);

} else if(symbol=="CHFJPY") { return(10);

} else if(symbol=="EURAUD") { return(10);

} else if(symbol=="EURCAD") { return(11);

} else if(symbol=="EURCHF") { return(12);

} else if(symbol=="EURGBP") { return(13);

} else if(symbol=="EURJPY") { return(14);

} else if(symbol=="EURUSDm") { return(15);

} else if(symbol=="GBPCHF") { return(20);

} else if(symbol=="GBPJPY") { return(21);

} else if(symbol=="GBPUSD") { return(22);

} else if(symbol=="USDCAD") { return(40);

} else if(symbol=="USDCHF") { return(41);

} else if(symbol=="USDJPY") { return(42);

} else if(symbol=="GOLD") { return(90);

} else { Comment("unexpected Symbol"); return(0);

}

}

int OrderSendExtended(string symbol, int cmd, double volume, double price, int slippage, double stoploss, double takeprofit, string comment, int magic, datetime expiration=0, color arrow_color=CLR_NONE) {

datetime OldCurTime;

int timeout=30;

int ticket;

OldCurTime=CurTime();

while (GlobalVariableCheck("InTrade") && !IsTradeAllowed()) {

if(OldCurTime+timeout<=CurTime()) {

Print("Ошибка в OrderSendExtended(): Timeout encountered");

return(0);

}

Sleep(1000);

}

GlobalVariableSet("InTrade", CurTime()); // устанавливаем индикатор блокировки

ticket = OrderSend(symbol, cmd, volume, price, slippage, stoploss, takeprofit, comment, magic, expiration, arrow_color);

GlobalVariableDel("InTrade"); // снимаем индикатор блокировки

return(ticket);

}

Попробуйте умножить InitialStopLoss на 10 на реальном счете. Этот советник написан для 4-х значных брокеров

______________________

PS : вы также должны умножить TakeProfit на 10, чтобы быть последовательным и иметь это как пипсы, но если вы тестировали его с этими числами, вы не получите те же результаты, что и при обратном тестировании (просто потому, что обратное тестирование позволило вам использовать значения для этих двух, которые ни демо-счет, ни реальный счет не позволят вам).

 
mladen:
zigflip Последние два psar как "последняя верхняя/нижняя пара psar" или "последние 2 бара"?

Извините за поздний ответ, Младен, я думал, что у меня включена подписка на почту, но...

Я имею в виду последнюю пару псар!

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

Спасибо за помощь,

Причина обращения: