extremumprice.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.//--------------------------------------------------------------------externint Quant_Bars =30; // Количество баровbool OpnBuy =false,
OpnSell =false;
//--------------------------------------------------------------------int start() // Спец. функция start
{
int i; // Номер бара double Minimum=Bid, // Минимальная цена
Maximum=Bid; // Максимальная ценаfor(i=0;i<=Quant_Bars-1;i++) // От нуля (!) до..
{ // ..Quant_Bars-1 (!)if (Low[i]< Minimum) // Если < известного
Minimum=Low[i]; // то оно и будет минif (High[i]> Maximum) // Если > известного
Maximum=High[i]; // то оно и будет макс
}
//--------------------------------------------------------------------if (iOpen(NULL,0,1)>Maximum)
{
OpnBuy =true:
OpnSell=false;
}
if (iOpen(NULL,0,1)<Minimum)
{
OpnSell=true;
OpnBuy =false:
}
//-------------------------------------------------------------------// А тут код открытия позиций. if (OpnBuy) {открываем Бай};// if (OpnSell) {открываем Селл};// Но обязательно нужно сделать проверку на существование уже открытой позиции,// иначе они будут открываться на каждом тике пока присутствует сигнал...return; // Выход из start()
}
//--------------------------------------------------------------------
//----------------- Закрытие позиций если эквити выросло на N процентов ---------------------------if (Equ_NEW>=Equ_OLD+EquPerc) // Новое эквити больше старого на процент прибыли..
{
// ClosePosBySizeLossInCurrency(NULL, -1, -1, 0); // Закрытие всех убыточных позиций
ClosePosFirstProfit(NULL, -1, -1); // Закрываем все позиции, сначала прибыльные
DeleteOrders(NULL, -1, -1); // Удаляем ордера
Equ_NEW=AccountEquity(); // Запоминаем новое значение эквити
Equ_OLD=Equ_NEW; // и вписываем его в "старое"
CountClsEQU++; // Увеличиваем счётчик кол-ва закрытий для ф-ции вывода информации
LockBuy51 =true; // Разрешаем открытие локирующих
LockSell51=true; // позиций Buy и Sell
OpnBuy51 =true; // и вообще разрешаем открываться
OpnSell51 =true; // в любую сторону...
}
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------if (Equ_NEW<=Equ_OLD-EquPerc/2) // Новое эквити меньше старого на столько-то процентов...
{
Trade=false; // Запрещаем торговлю//-------------- Закрытие двух позиций, если ранее был установлен лок на убыточную ------------- if (OrderSelect(TicketLoss, SELECT_BY_POS, MODE_TRADES)) // Выбираем убыточную позицию (если её тикет
{ // ранее был сохранён в TicketLoss)double prloss=OrderProfit()+OrderSwap(); // Размер профита убыточной позицииint typeloss =OrderType(); // Тип убыточной позицииint mnloss =OrderMagicNumber(); // Magic убыточной позиции
}
if (OrderSelect(TicketLock, SELECT_BY_POS, MODE_TRADES)) // Выбираем локирующую позицию (если её тикет
{ // ранее был сохранён в TicketLock)double prlock=OrderProfit()+OrderSwap(); // Размер профита локирующей позицииint typelock =OrderType(); // Тип локирующей позиции
}
if (prloss+prlock>=10*Point) // Если их суммарный профит больше 10 пунктов
{
ClosePositions(NULL, typelock, 5100); // Закрываем локирующую позицию
ClosePositions(NULL, typeloss, mnloss); // Закрываем убыточную позицию
}
//--------------- Поиск убыточной позиции и установка локирующей ------------------------- double Loss=0; // Последнее значение убыткаint i, k=OrdersTotal(), OrdTicket=-1;
for (i=k-1; i>=0; i--) { // Цикл по всем ордерам терминалаif (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
if ((OrderProfit()+OrderSwap()<0)) { // Если профит позиции меньше 0if (Loss>OrderProfit()+OrderSwap()) { // Если последнее значение убытка больше убытка позиции
Loss=OrderProfit()+OrderSwap(); // Значит тут убыток больше, запоминаем как последнее
OrdTicket=i; // Запоминаем номер убыточной позиции
}
}
}
}
if (OrdTicket>=0) {
if (OrderSelect(OrdTicket, SELECT_BY_POS, MODE_TRADES)) { // Выбираем позицию по тикету
TicketLoss=OrdTicket; // Запоминаем как тикет убыточной позыif (OrderType()==OP_BUY) // Если её тип Бай
{
Magic=5100; // Задаём магик...
New_Comm="Sell_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_SELL, 5100, 0)){ // Если нет локирующего Sell
OpenPosition(NULL,OP_SELL,Lots_New,0,pb-tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_SELL, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Sell
}
if (OrderType()==OP_SELL)
{
Magic=5100; // Задаём магик...
New_Comm="Buy_M5_Стратегия_1_Локирующая позиция"; // Задаём комментарий для позиции
Lots_New=NormalizeLot(OrderLots()*2, False, NULL); // Увеличим лот в два разаif (!ExistPositions(NULL, OP_BUY, 5100, 0)){ // Если нет локирующего Buy
OpenPosition(NULL,OP_BUY,Lots_New,0,pa+tp*100*po,Magic,New_Comm);} // Открываем локирующий...if (ExistPositions(NULL, OP_BUY, 5100, 0)) // Проверяем, заодно и выбираем её
{TicketLock=OrderTicket();} // Сохраняем тикет локирующего Buy
}
}
}
}
からスタートします。
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
ゼロバーからではなく、最初のバーから高値と安値をカウントし、ゼロバーではBidがMinより低くなることはできません。
二重
Min=Bid、変数宣言
マックス=ビッド
____________________________________________________________________________________________
for (i=0;i<=20-1;i++) オープニング基準
{if (Low[i]<Min) Min=Low[i]:
if (High[i]>Max) Max=High[i];
}
if (..................&&Ask>Max)
{
Opn_B=true; //オープン Buy
}
if (............&&Bid<Min)
{
Opn_S=true; //Sellを開く
}
___________________________________________________________________________________________
醜くてすみません。コードがうまくいかず、削除してしまったので、記憶から書くしかなかったのです。でも、プロであるあなたには理解できるはず(だといいのですが)。
____________________________________________________________________________________________
お世辞がうまい :))私もあなたと同じ初心者です...。
こんな感じです。確認せず、その場で書いてしまった...。そこで、こんな理屈を考えてみました。
1. 保留注文にマジックナンバー、例えば101を設定し、注文をポジションに変換するフラグ、例えばConvOrd=falseをリセットします。
2. マジック101の位置が出現したかどうかを確認し、出現していれば、変換フラグConvOrd=trueを設定する。
3.ConvOrdの真偽を確認し、ConvOrd==trueの場合。
マジックナンバー101の位置が存在するかどうかを確認し、存在しない場合は
は、すでに終了していることを意味します。
{ConvOrd=falseを選択解除し、新しい保留を設定する;}。
フラッグはなくても大丈夫だと思うのですが...。
理屈はわかるが、コードでどう実装すればいいのかわからない。いろいろなバリエーションを試しましたが、結果が出ません。私はダミーだと思います。だから、ここに書いたのです。P.663で、私のコードをお見せしました。もし興味があれば、どうすれば改善されるのか、せめて教えてください。ありがとうございます。
もっと簡単な方法で、SellStop注文を出すときに、TakeProfitの値を覚えておいて、Bidがその価格より下がったらBuyに出すという方法を試してみてください。
もっと簡単な方法で、SellStop注文を出すときに、TakeProfitの値を覚えておいて、Bidがこの価格より下がったら、Buyに出すという方法を試してみてください。
アドバイスありがとうございます!このオプションはすでに試しましたが、私の戦略には適していません。
なぜ一度に2つのロック位置があるのか理解できない。その理屈はこうだ。
エクイティが前回の利益の一定割合に達したら、すべてのポジションをクローズする...。これはちゃんと機能している...次は...
エクイティが以前の値から一定の割合で下落した場合、最も損失の大きいポジションを探し、それが誰であるかを特定する...。買うか売るか...
を開き、ダブルロットで反対方向にロックポジションを開きます。そして、彼らの(負けポジションとロックポジションの)合計利益を調べ、それが大きくなったらすぐに、その利益を確認します。
仮に10pipsとすると、それを閉じる...
論理的には、次のティックでエクイティをチェックし、問題なければ作業を継続するはずなのですが......。また何も問題なければ、次の吸い魔を探すことになるのですが・・・。
しかし、なぜか2つのロック位置が同時に開いてしまう...。と売り買いし、ロットが0.1だった場合、最初のロックはロットの2倍=0.2が開きます。
で、2つ目はそれをまた2倍にして0.4ロットで開く・・・。敬称略、ロックとは一体何なのか、太陽の下の場所を争っているのだとしたら・・・。:(
コードを添付しておきますので、どなたか突いてみてください。を指します。
からスタートします。
//------------- Включение вывода убыточных позиций в ноль, если эквити упало на N процентов -----------------------
...どこかでジョイントを...
ページ番号"666":-)