Основное правило трейдера - дай прибыли расти, обрезай убытки! В статье рассматривается один из основных технических приемов, позволяющий следовать этому правилу - перемещение уровня защитной остановки (уровня Stoploss) вслед за растущей прибылью позиции, другими словами - скользящий стоп или трейлинг стоп (trailingstop). Приводится пошаговая процедура создания класса для трейлинг стопа на индикаторах SAR и NRTR, который каждый желающий сможет за 5 минут встроить в своего эксперта или использовать независимо для управления позициями на своем счете.
datetime end=TimeCurrent(); // текущее серверное времяdatetime start=end-PeriodSeconds(PERIOD_D1);// установим начало на сутки назад//--- запросим в кэш программы нужный интервал торговой историиHistorySelect(start,end);
//--- получим количество сделок в историиint deals=HistoryDealsTotal();
//--- получим тикет сделки, имеющей последний индекс в спискеulong deal_ticket=HistoryDealGetTicket(deals-1);
if(deal_ticket>0) // получили в кэш сделку, работаем с ней
{
//--- тикет ордера, на основании которого была проведена сделкаulong order =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
long order_magic=HistoryDealGetInteger(deal_ticket,DEAL_MAGIC);
long pos_ID =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
double priceh =HistoryDealGetInteger(deal_ticket,DEAL_PRICE); // не могу определить цену открытия
PrintFormat("Сделка #%d по ордеру #%d с ORDER_MAGIC=%d участвовала в позиции %d",
deals-1,order,order_magic,pos_ID);
}
else// неудачная попытка получения сделки
{
PrintFormat("Всего в истории %d сделок, не удалось выбрать сделку"+
" с индексом %d. Ошибка %d",deals,deals-1,GetLastError());
}
//--- получим общее количество позицийint positions=PositionsTotal();
//--- пробежим по списку ордеровfor(int i=0;i<positions;i++)
{
ResetLastError();
//--- скопируем в кэш позицию по ее номеру в спискеstring symbol=PositionGetSymbol(i); // попутно получим имя символа, по которому открыта позицияif(symbol!="") // позицию скопировали в кэш, работаем с ней
{
long pos_id =PositionGetInteger(POSITION_IDENTIFIER);
double price =PositionGetDouble(POSITION_PRICE_OPEN);
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
long pos_magic =PositionGetInteger(POSITION_MAGIC);
string comment =PositionGetString(POSITION_COMMENT);
if(pos_magic==EA_Magic)
{
PositionModify(Symbol(),NormalizeDouble(( - StopLoss*_Point),4),
NormalizeDouble(( + TakeProfit*_Point),4)); // ну здесь еще через запрос в зависимости от типа ордера
}
PrintFormat("Позиция #%d по %s: POSITION_MAGIC=%d, цена=%G, тип=%s, комментарий=%s",
pos_id,symbol,pos_magic,price,EnumToString(type),comment);
}
else// вызов PositionGetSymbol() завершился неудачно
{
PrintFormat("Ошибка при получении в кэш позиции c индексом %d."+
" Код ошибки: %d", i, GetLastError());
}
}
ストラテジーテスターで ストップロスやプロフィットを設定せず、マーケットプライスでポジションを持つのはなぜですか?
CTrade(trade.Buy)を使って、ポジションを開設しています。
(trade.PositionOpen)で開いてみましたが、同じように、デモで開いてストップをかけています。
手動でできるのはわかるが、ロボットにやってもらいたい。
注文を修正する関数を作成するにはどうすればよいですか?
https://www.mql5.com/ru/articles/134
こんにちは、EAのための違いがあるかどうか教えてください:1000&(ドル口座)または1000ルーブル(ルーブル口座)の最低入金額?
親愛なる皆様、助けてください!!!すでに最後のステップで落胆している、出来合いの戦略から。トレードの平均化ができない、スルー
トレードを平均化しようとするしかし、パラメータでは
始値を取得し、平均化した結果ずれた値を知りたいので、始値を決定できない。
またはちょうど注文履歴を介して 最初と2番目の注文の価格を見つけるために、すでにこれらのデータに基づいて平均化されるように、私はそれが私のためにあまりにも複雑であるこの方法を望んでいない
親愛なる皆様、助けてください!!!すでに最後のステップで落胆している、出来合いの戦略から。トレードの平均化ができない、スルー
平均的な取引をしたいんだしかし、パラメータでは
始値を取得し、平均化した結果ずれた値を知りたいので、始値を決定できない。
またはちょうど注文履歴を介して 最初と2番目の注文の価格を見つけるために、すでにこれらのデータに基づいて平均化されるように、私はそれが私のためにあまりにも複雑であるこの方法を望んでいない
こんにちは、ひとつだけはっきりさせてください。
例えば、OnTickイベントを使って、条件によってポジションをオープンしたりクローズしたりするEAがあるとします。ストラテジーテスターでは、タイムフレームを設定してEAをテストすることができます。両者がどのようにリンクしているのかがわからない。ストラテジーテスターでテストしたEAは、1ティックごとに反応するのでは?それともStrategy Testerで選択したタイムフレームにのみ反応するのでしょうか?この質問が明確であることを望みます