//+----------------------------------------------------------------------------------------+//| ММ Функция работает по принципу наращивания лота при увеличении |//| депозита, и уменьшении лота при серии убыточных сделок лот возвращается |//| на начальный лот в данном случае 0.1 если происходит профит то следующий |//| лот расчитывается по прогресии. |//| К примеру при депозите 500 старт лота будет равен 0.1 далее депозит |//| увеличивается до 5000 лот будет равен 1 если будет две убыточные сделки |//| лот уменьшится от предыдущего деленое на DecreaseFactor = 3, если по далее |//| две сделки будут убыточные,уменьшится от предыдущего деленое на DecreaseFactor = 3, |//| далее если сделка будет прибыльной то следующий лот откроется из расчета |//| баланса депозита "баланс/500*0.1"=лот внешние переменные |//+----------------------------------------------------------------------------------------+double LotsOptimized() {
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
double maxlot = MarketInfo(Symbol(), MODE_MAXLOT);
double lot = Lots;
int orders = OrdersHistoryTotal();
int losses = 0;
lot = NormalizeDouble((AccountFreeMargin()- AccountCredit()) * MaximumRisk / balans, 2);
if (DecreaseFactor > 0.0) {
for (int i = orders - 1; i >= 0; i--) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == FALSE) {
Print("Error in history!");
break;
}
if (OrderSymbol() != Symbol() || OrderType() > OP_SELL || OrderMagicNumber()!=mn) continue;
if (OrderProfit() > 0.0) break;
if (OrderProfit() < 0.0) losses++;
}
if (losses > 1) lot = NormalizeDouble(lot - lot * losses / DecreaseFactor, 2);
}
if(lot < minlot) lot = minlot;
if(lot > maxlot) lot = maxlot;
return (lot);}
if (GetProfitOpenPosInCurrency()>NumberOfLossPosToday())
int slippage=1;
int ask, bid, open;
double point;
for (int i=OrdersTotal()-1; i>=0; i--)
{
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) break;
if (OrderType()==OP_BUY)
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if (point==0) break;
bid=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point);
open=MathRound(OrderOpenPrice()/point);
if (bid-open<Profit) continue;
OrderClose(OrderTicket(),OrderLots(),bid*point,slippage);
}
if (OrderType()==OP_SELL)
{
point=MarketInfo(OrderSymbol(),MODE_POINT);
if (point==0) break;
ask=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point);
open=MathRound(OrderOpenPrice()/point);
if (open-ask<Profit) continue;
OrderClose (OrderTicket(),OrderLots(),ask*point,slippage);
}
}
}
//--------------------------------------------------------------------double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
double p=0;
int i, k=OrdersTotal();
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (mn<0 || OrderMagicNumber()==mn) {
p+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
}
return(p);
}
//--------------------------------------------------------------------int NumberOfLossPosToday(string sy="", int op=-1, int mn=-1) {
datetime t;
int i, k=OrdersHistoryTotal(), kp=0;
if (sy=="0") sy=Symbol();
for (i=0; i<k; i++) {
if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) {
if (OrderSymbol()==sy || sy=="") {
if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
if (op<0 || OrderType()==op) {
if (mn<0 || OrderMagicNumber()==mn) {
t=OrderCloseTime();
if (Year()==TimeYear(t) && DayOfYear()==TimeDayOfYear(t)) {
if (OrderProfit()<0) kp++;
}
}
}
}
}
}
}
return(kp);
}
コードに"mn"を正しく入れたかどうか、教えてください。
ある時刻にEAを起動させるための時間的な "条件 "を提案してください。
マジックナンバーをMMで追跡できるように、コードに"mn"を正しく追加したかどうか教えてください。
Magicがグローバル変数 または定数として宣言されている場合。
int mn = ****;
というように、構造的に間違いがないように(小さな構文編集)。
MODE_LOTSTEPの倍数でロットを正規化しないと、遅かれ早かれエラー131(ERR_INVALID_TRADE_VOLUME)でつまずくことになります。
まあ、良心的に関数内で宣言されていない変数も...。:)
こんにちは。
専門家(こういうことに詳しい人...)の力を借りたい。
アイデアが浮かばない...全部見つけてロボットに入れたけど、やっぱりそううまくはいかない =(
すべての利益を決済したい。
総収益が総損失より大きいときに、すべての利益が出ているポジションを決済したいのですが、どうすればいいですか?利益が出ているポジションは全て決済するようにしている(利益>損失)
コードについて教えてください。利益が出ている取引をすべて決済する条件(総利益>総損失)が機能しない
最大残高」の時点から負けトレードをカウントして、利益が出ているトレードはすべて損切り以上の利益が出るので決済し、新しいデポで負けトレードのカウントを再開するようにしてほしい。
入金残高を記録するExpert Advisorを見たことがある人はいますか?例えば、残高50で取引を開始し、損失が発生した場合、Expert Advisorは残高がどれだけ減少したかを記憶し、次回にオープンポジションの 利益がこの損失を上回った場合、利益のある取引をすべて決済し、損失を再び数え始める必要があるのです。
前回の1-2-3注文が負けていたことを知るにはどうしたらよいですか?
最後の注文を知るにはどうしたらよいですか?
例えば、保留中の買い指値が発動したかどうか、発動した場合はどの価格で発動したかを知り、その後、新しい指値を入れる必要があります。
トレーリングストップで注文がトリガーされたことを知り、トレーリングストップがトリガーされた後に新しい注文を出すにはどうすればよいですか?