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 }
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++; } }
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に「1日4回取引/利益目標に達したら取引停止」機能を実装したいと思います。
最大取引限度額/利益に達した場合、EAは取引を継続するために翌日まで待つ必要があります。
どなたか私のコードをレビューしていただけないでしょうか。
疑似コードのようなものです... ;-)
事前にありがとうございました。
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;
Mladenさん、こんにちは。
どうもありがとうございます。
一日の利益目標」を確認 することも可能でしょうか? 例えば、EAが一日あたり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());
}
}
Mladenさん、こんにちは。
どうもありがとうございます。
一日の利益目標」を確認することも可能でしょうか? 例えば、EAが一日あたり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を使用することができます。
追記:もし、合計を出したいなら、同様のコード追加を、すでに決済された注文にも追加できます。
Mladenさん、こんにちは。
AutoFiboAutoTrend "インジケータを修正していただき、うまく動作しています。フィボの方向が「上」から「下」に変わったときに通知するオーディオアラートを追加することは可能でしょうか?Plsは、画像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:もしあなたが合計を持ちたいなら(閉じた注文と開いた注文の)、同様のコードの追加は、すでに閉じた注文にも追加することができます)
こんにちは、Mladen。
ありがとうございます。
私はこのようなコードを実装しています。
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
}
mladenを助けてください。添付のEAではSLIPPAGEは機能していません。
Rajiv
SlippageはOrderSend()コールの 正しい場所にあります - もっと大きな値を使ってテストしてみてください。
助けてください...
このインジケータは
です。
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ファイルに保存したいです "クローズ "ごとにホバリングと更新ファイルを再度せずに。ただ、1行のファイルを仕上げる...例えば1分ごと))))))お願いします、お願いします。Rとの相互作用のための作業装置を与えてください。
私を助けてください...すべてのエクスポート手段で、"Close "ごとに.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ファイルに保存したいです "閉じる "ごとにホバリングせずに、再びファイルを更新します。ただ、1行のファイルを終了する...例えば1分ごと))))))))お願いします、お願いします。私に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パラメータを 設定し、動作させるだけでよい。