//+------------------------------------------------------------------+//| ТРЕЙЛИНГ СТАНДАРТНЫЙ-СТУПЕНЧАСТЫЙ |//| Функции передаётся тикет позиции, расстояние от курса открытия, |//| на котором трейлинг запускается (пунктов) и "шаг", с которым он |//| переносится (пунктов) |//| Пример: при +30 стоп на +10, при +40 - стоп на +20 и т.д. |//+------------------------------------------------------------------+void TrailingStairs(int ticket,int trldistance,int trlstep)
{
double nextstair; // ближайшее значение курса, при котором будем менять стоплосс// проверяем переданные значенияif ((trldistance<MarketInfo(Symbol(),MODE_STOPLEVEL)) || (trlstep<1) || (trldistance<trlstep) || (ticket==0) || (!OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)))
{
Print("Трейлинг функцией TrailingStairs() невозможен из-за некорректности значений переданных ей аргументов.");
return(0);
}
// если длинная позиция (OP_BUY)if (OrderType()==OP_BUY)
{
// расчитываем, при каком значении курса следует скорректировать стоплосс// если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэдif ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()))
nextstair = OrderOpenPrice() + trldistance*Point;
// иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэдelse
nextstair = OrderStopLoss() + trldistance*Point;
// если текущий курс (Bid) >= nextstair и новый стоплосс точно лучше текущего, корректируем последнийif (Bid>=nextstair)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()<OrderOpenPrice()) && (OrderOpenPrice() + trlstep*Point<Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
else
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss() + trlstep*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
// если короткая позиция (OP_SELL)if (OrderType()==OP_SELL)
{
// расчитываем, при каком значении курса следует скорректировать стоплосс// если стоплосс ниже открытия или равен 0 (не выставлен), то ближайший уровень = курс открытия + trldistance + спрэдif ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()))
nextstair = OrderOpenPrice() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
// иначе ближайший уровень = текущий стоплосс + trldistance + trlstep + спрэдelse
nextstair = OrderStopLoss() - (trldistance + MarketInfo(Symbol(),MODE_SPREAD))*Point;
// если текущий курс (Аск) >= nextstair и новый стоплосс точно лучше текущего, корректируем последнийif (Ask<=nextstair)
{
if ((OrderStopLoss()==0) || (OrderStopLoss()>OrderOpenPrice()) && (OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point>Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point))
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderOpenPrice() - (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
else
{
if (!OrderModify(ticket,OrderOpenPrice(),OrderStopLoss()- (trlstep + MarketInfo(Symbol(),MODE_SPREAD))*Point,OrderTakeProfit(),OrderExpiration()))
Print("Не удалось модифицировать стоплосс ордера №",OrderTicket(),". Ошибка: ",GetLastError());
}
}
}
以下は、その完全なコードで、代わりに挿入されます。
//+------------------------------------------------------------------+void TrailingStairs(int ticket,int trldistance)
{
int Spred=Ask - Bid;
if (OrderType()==OP_BUY)
{
if((Bid-OrderOpenPrice())>(Point*trldistance))
{
if(OrderStopLoss()<Bid-Point*trldistance || (OrderStopLoss()==0))
{
OrderModify(ticket,OrderOpenPrice(),Bid-Point*trldistance,OrderTakeProfit(),0,Green);
if (PolLots)
if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
{
OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Ask,3,Green);
}
else
{
OrderClose(ticket,OrderLots(),Ask,3,Green);
}
}
}
}
else
{
if((OrderOpenPrice()-Ask)>(Point*trldistance))
{
if((OrderStopLoss()>(Ask+Point*trldistance)) || (OrderStopLoss()==0))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*trldistance,OrderTakeProfit(),0,Red);
if (PolLots)
if (NormalizeDouble(OrderLots()/2,2)>MarketInfo(Symbol(), MODE_MINLOT))
{
OrderClose(ticket,NormalizeDouble(OrderLots()/2,2),Bid,3,Green);
}
else
{
OrderClose(ticket,OrderLots(),Bid,3,Green);
}
}
}
}
}
3.標準的な「ステップ」のトレーリングを行う。
このタイプのトレーリングは、標準的なものを改良したものです。私の記憶に間違いがなければ、同様のモデルが一度KimIVによって 作成されました(しかし、相対的な方が素敵なので...:)それは標準のトレーリングとは異なり、トレーリングストップ損失がポイントで転送されていない点です(例えば、30ポイントの距離で+31でストップ損失を追跡、+32で-2によって、などなど)。例えば、40pipsの距離でトレーリングし、ストップロスの距離を10pipsとすると、+40に達するとストップロスは+10pipsに移動し、+50の利益(40pips+ステップ)に達するまで何も変わりません(つまり、このアルゴリズムのポイントである価格に一定の自由度を与えている)、+50でストップロスだけが+10から+20 pipsへ、+60でストップロスは+30pipsへ、などと移動していきます。
パラメータ:
ticket - 一意の注文番号 (関数 withOrderSelect() を呼び出す前に選択);
trldistance -「トロール」する現在のレートからの距離 (ポイント) (MarketInfo(Symbol(),MODE_STOPLEVEL) より小さくない;
trlstep - 損切り値を変更する「ステップ (ポイント) (1 以外はない)」。)
trlstep=1 の場合、標準のトレーリングストップと変わりません。このアルゴリズムの主な「特徴」は、やはりレートに「動きの自由度」を与えることです。ストップロスは、価格が「ぶらぶら」した後に引き上げられます。このトレイリングアルゴリズムは、V. Barishpoltsがすでに述べた「Moving Channels」戦術ルールの説明の中で初めて出会ったものである。
=================
Expert Advisorのこれが面白い
以下は、その完全なコードで、代わりに挿入されます。
こん
自分のEAに組み込むのではなく、気に入ったEAを改造することから始めると、結果はほとんど同じになりますが、手間は少なくなります。
それに、他人のコードを読んで理解する能力も重宝されるでしょうし...。
自分のEAに組み込むのではなく、気に入ったEAを改造することから始めると、結果はほとんど同じになりますが、手間は少なくなります。
それに、他人のコードを読んで理解する能力も重宝されるでしょうし...。
彼が持つことを望む限り、できない!?
)))誰もがそこからスタートする...。そして--森に入れば入るほど、パルチザンは肥えていく......。
EAでのコードの書き方を教えてください。
ある期間(例えば10時45分から11時15分まで)の高値と安値を形成するのはどれでしょうか。
9.00にEAのスイッチを入れ、10.45にスイッチを入れて監視を開始しました。 バーが閉じると(例えば15分チャート)11.15を読み取り監視を続け、例えば、私は高と低を識別し、これらの線からあまり遠くない場所に注文を入れました。
ご感想をお寄せいただき、ありがとうございました。
どういう原理でトラリングを繋いでいるのかが分からない。
実際には、ただ動作するはずです
どういう原理でトラリングを繋いでいるのかが分からない。
結局のところ、事実上、動くだけでいいはずなのです。
何も、誰も、「ただうまくいく」ことはないのです。
このトレイルが何を検索するのか、どのような条件で検索するのか、どのような手順で検索するのか、追加条件があるのか、などを理解する必要があります。
トロールコードを分解すればすべてが明らかになりますが、「プラグアンドプレイ」の原則は良い結果につながらない......。