Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Уважаемые про-кодеры,
Я хотел бы реализовать в своем советнике функцию "четыре сделки в день / остановка торговли при достижении цели по прибыли".
Если максимальный торговый лимит / прибыль достигнута, советник должен ждать до следующего дня, чтобы продолжить торговлю.
Мне интересно, может ли кто-нибудь просмотреть мой код, у меня тут немного "заморозка мозга", поэтому код
является своего рода псевдокодом... ;-)
Заранее спасибо!
extern int MaxShortTrades = 2;
extern int MaxLongTrades = 2;
extern double profitTarget = 300; // Target in Money
// Count Trades per Day.
int y;
int totalOrders = 4;
datetime toT; // Time of Trade
datetime doT; // Day of Trade
datetime now = TimeCurrent();
datetime boD=now-now%86400; // Beginning of day
if (AccountProfit()>= profitTarget)
{
for(y=0;y<totalOrders; y++)
{
if(OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
{
toT=OrderOpenTime(); // Time of Trade
doT=toT-toT%86400; // Day of Trade.
if(doT==boD)
{ // Time of Trade within Current Day.
for(j=OrdersTotal()-1;j>=0; j--)
{
if(OrderType()==OP_BUY) totalOrders++; // Check # of long trades.
if(OrderType()==OP_SELL) totalOrders++; // Check # of short trades
}
}
}
}
}
if(totalOrders<MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrders<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
Чтобы проверить как историю (для ордеров, закрытых в текущий день), так и открытые ордера, попробуйте сделать следующее:
int totalOrdersLong = 0, totalOrdersShort = 0;
for(int y=OrdersHistoryTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
if(totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
Привет Младен,
Большое спасибо за помощь, теперь стало понятнее, как с этим работать.
Можно ли также проверить наличие "дневной цели прибыли"? Допустим, советник должен пройти 50.- EUR в день,
если цель на день достигнута, он должен прекратить торговлю и продолжить на следующий день.....
Возможно, что-то вроде этого:
if (AccountProfit()<= profitTarget)
{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
int totalOrdersLong = 0, totalOrdersShort = 0;
for(int y=OrdersHistoryTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
if(totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
}
// Check if Profit Targer for the day is reached, so close all open Opsitions
if (AccountProfit()>= profitTarget)
{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
else
if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
{
if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
Здравствуйте, Младен,
Большое спасибо за помощь, теперь стало понятнее, как с этим работать.
Можно ли также проверить "дневную цель прибыли"? Скажем, советник должен пройти 50.- EUR в день,
если цель на день достигнута, он должен прекратить торговлю и продолжить на следующий день.....
Возможно, что-то вроде этого:
if (AccountProfit()<= profitTarget)
{
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
int totalOrdersLong = 0, totalOrdersShort = 0;
for(int y=OrdersHistoryTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
if(totalOrdersLong <MaxLongTrades && Indicator_LONG_signal) Order=SIGNAL_BUY;
if(totalOrdersShort<MaxShortTrades && Indicator_SHORT_signal) Order=SIGNAL_SELL;
}
// Check if Profit Targer for the day is reached, so close all open Opsitions
if (AccountProfit()>= profitTarget)
{
if(OrderSelect(buy_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage*PipMultiplier,MediumSeaGreen);
Print("Error closing Buy #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
else
if(Order==SIGNAL_CLOSESELL && sell_ticket!=0)
{
if(OrderSelect(sell_ticket,SELECT_BY_TICKET))
{
dummyResult=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage*PipMultiplier,DarkOrange);
Print("Error closing Sell #",(string)OrderTicket()," Error code ",(string)GetLastError());
}
}
Почему бы вам не добавить сбор (суммирование) прибыли в цикл, который проверяет количество открытых в данный момент длинных и коротких ордеров?
Что-то вроде этого :
double profitSoFarLong=0,profitSoFarShort=0;
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); }
if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
}
}
А затем вы можете использовать profitSoFarLong и profitSoFarShort для дальнейшего контроля.
PS: если вы хотите иметь общую сумму (для закрытых и открытых ордеров), аналогичное дополнение кода можно добавить и к уже закрытым ордерам)
Здравствуйте, Младен,
Вы исправили индикатор "AutoFiboAutoTrend" для меня, и он хорошо работает. Можно ли добавить звуковое оповещение с уведомлением, когда направление фибо меняется с "вверх" на "вниз"? Пожалуйста, посмотрите изображения 1 + 2
Спасибо Lea
Почему бы вам не добавить сбор (суммирование) прибыли в цикл, который проверяет количество открытых в данный момент длинных и коротких ордеров?
Что-то вроде этого :
double profitSoFarLong=0,profitSoFarShort=0;
for(int y=OrdersTotal()-1;y>=0; y--)
{
if (OrderSelect(y,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); }
if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
}
}
А затем вы можете использовать profitSoFarLong и profitSoFarShort для дальнейшего контроля.
PS: если вы хотите иметь общую сумму (по закрытым и открытым ордерам), то аналогичное дополнение кода можно добавить и к уже закрытым ордерам)
Привет, Младен,
большое спасибо за помощь!
Я реализовал код следующим образом:
datetime today = StringToTime(TimeToString(TimeCurrent(),TIME_DATE));
int totalOrdersLong = 0, totalOrdersShort = 0;
int x;
for(x=OrdersHistoryTotal()-1;x>=0; x--)
{
if (OrderSelect(x,SELECT_BY_POS,MODE_HISTORY))
if (OrderCloseTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
for(x=OrdersTotal()-1;x>=0; x--)
{
if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) totalOrdersLong++;
if (OrderType()==OP_SELL) totalOrdersShort++;
}
}
double profitSoFarLong=0,profitSoFarShort=0;
for(x=OrdersTotal()-1;x>=0; x--)
{
if (OrderSelect(x,SELECT_BY_POS,MODE_TRADES))
if (OrderOpenTime()>=today)
{
if (OrderType()==OP_BUY) { totalOrdersLong++; profitSoFarLong += OrderProfit()+OrderCommission()+OrderSwap(); }
if (OrderType()==OP_SELL) { totalOrdersShort++; profitSoFarShort += OrderProfit()+OrderCommission()+OrderSwap(); }
}
}
// EA STOP if Profit is Reached.
if (profitSoFarLong>50 || profitSoFarLong>50)
{
if(OrderType()==OP_BUY) { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_ASK),0,CLR_NONE); }
if(OrderType()==OP_SELL) { dummyResult = OrderClose(OrderTicket(),OrderLots(),MarketInfo(s_symbol,MODE_BID),0,CLR_NONE); }
Print ("Account Profit Reached. All Open Trades Have Been Closed");
return(0);
Sleep(3600); // one hour
}
Пожалуйста, помогите мне, Младен. SLIPPAGE не работает в прикрепленном советнике
Раджив
Проскальзывание находится в правильном месте в вызове OrderSend() - попробуйте использовать какое-то большее значение и протестируйте его, так как в коде оно используется нормально.
Пожалуйста, помогите мне... Можно ли записывать в .csv файл каждое "Закрытие" со всеми средствами экспорта
в коде этот индикатор
void RSI_output(string SymbolName,int PeriodMinutes)
{
int size=iBars(SymbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
{
FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))
,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)
,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));
}
FileClose(handle);
return;
}
int start() { RSI_output(_Symbol,_Period); return(0); }
Я хочу сохранять в .csv файл каждое "закрытие" без зависания и повторного обновления файла. Просто заканчивая файл на одной строке ... каждую минуту, например))))))) ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, ПОЖАЛУЙСТА. Дайте мне рабочий инструмент для взаимодействия с R.
Пожалуйста, помогите мне... Можно ли записывать в .csv файл каждое "Close" всеми средствами экспорта.
в коде этого индикатора
void RSI_output(string SymbolName,int PeriodMinutes)
{
int size=iBars(SymbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(SymbolName+PeriodMinutes+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
{
FileWrite(handle,iTime(SymbolName,PeriodMinutes,i),TimeToStr(iTime(SymbolName,PeriodMinutes,i))
,iOpen(SymbolName,PeriodMinutes,i),iLow(SymbolName,PeriodMinutes,i),iHigh(SymbolName,PeriodMinutes,i)
,iClose(SymbolName,PeriodMinutes,i),iVolume(SymbolName,PeriodMinutes,i),iCustom(SymbolName,PeriodMinutes,"RSI",0,i));
}
FileClose(handle);
return;
}
int start() { RSI_output(_Symbol,_Period); return(0); }
Я хочу сохранять в .csv файл каждое "закрытие" без зависания и обновление файла снова. Просто завершение файла на одной строке ... каждую минуту, например))))))) ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, ПОЖАЛУЙСТА. Дайте мне рабочий инструмент для взаимодействия с R.
Да. история того, что есть на графике + 1 бар (& мои iCustom индикаторы). просто спросите, не переписывая файл навсегда.
Вот версия, у которой есть опция - переписывать ли старый файл данных или всегда создавать новый файл для каждого нового бара.
#property indicator_buffers 0
extern bool RewriteOldData=true;
void RSI_output(string symbolName,int PeriodMinutes, datetime time)
{
string name = (RewriteOldData) ? symbolName+PeriodMinutes : symbolName+PeriodMinutes+(string)(time/60);
int size =iBars(symbolName,PeriodMinutes); if(size==0) return;
int handle=FileOpen(name+"_RSI.csv",FILE_WRITE|FILE_CSV); if (handle<0)return;
FileWrite(handle,"Time seconds;Time;Open;Low;High;Close;Volume;RSI");
for (int i=size-1;i>=0;i--)
FileWrite(handle,iTime(symbolName,PeriodMinutes,i),TimeToStr(iTime(symbolName,PeriodMinutes,i))
,iOpen(symbolName,PeriodMinutes,i),iLow(symbolName,PeriodMinutes,i),iHigh(symbolName,PeriodMinutes,i)
,iClose(symbolName,PeriodMinutes,i),iVolume(symbolName,PeriodMinutes,i),iCustom(symbolName,PeriodMinutes,"RSI",0,i));
FileFlush(handle);
FileClose(handle);
return;
}
int start()
{
static datetime lastTime=0;
if (lastTime!=Time[0]) RSI_output(_Symbol,_Period,Time[0]);
lastTime= Time[0];
return(0);
}
Это индикатор, и все, что вам нужно сделать, это установить параметр RewriteOldData и пусть он работает.