アドバイザーを無料でお書きします - ページ 21 1...141516171819202122232425262728...171 新しいコメント MIR_KAZAN 2015.05.08 15:23 #201 Vitalii Ananev:D1ローソク足の始値で取引を開始するということですか?その場合、Expert Advisorのロジックに、指定した時間帯にのみ取引を開始する条件を指定します。 なるほど、もう一つ質問ですが、価格から+15pipsのところに2つのペンディングオーダーを入れ、SellStopとByStopを入れました。そして、ティック ごとに新しい価格に移動させる。急激な値動き(特にニュース時)に価格が触れた途端、端末がハングアップしてしまうのです。(なぜフリーズするのか? Vitalii Ananev 2015.05.09 08:28 #202 MIR_KAZAN: もう一つの質問ですが、価格から+15pipsのところにbuystopとsellstopという二つの保留注文を設定しました。そして、ティックごとに新しい価格に移動させる。急激な値動き(特にニュース時)に価格が触れた途端、端末がハングアップしてしまうのです。(なぜフリーズするのか?なぜハングアップするのか、私は超能力者ではありません、Expert Advisorのコードに対処してください。注文が執行された後、EAがその注文を新しい価格に移動させようとしますが、保留中の注文が すでに市場にあるため、EAがハングアップしていると推測できます。Expert Advisor の主要な変数の状態をログに表示し、その動作ロジックを解析してみましょう。 MIR_KAZAN 2015.05.09 09:46 #203 Vitalii Ananev:なぜハングアップするのか、私は超能力者ではありません、Expert Advisorのコードに対処してください。注文が執行された後、EAがその注文を新しい価格に移動させようとしますが、保留中の注文が すでに市場にあるため、EAがハングアップしていると推測できます。EAの主要な変数の状態をログに表示し、EAの動作のロジックを分析してみてください。すべての条件を正しく設定したつもりです。 input int Magic = 12; // Магический номер ордеров input int Proskalzivanie = 5; // Проскальзывание input int period = 200; // Количество свечей для анализа волятильности input int tral = 20; // Дистанция траллинга в пунктах input int tral_step = 3; // Шаг срабатывания траллинга input bool use_step = true; // Использовать шаг input double Lot = 0.01; // Лот input double otstups = 0.0006; // Отступ от цены//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+ int OnInit() {//--- return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+ void OnDeinit(const int reason) {//--- return; }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+ void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); for (int pos=OrdersTotal()-1; pos>=0; pos--) { if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderType()<2) { double SLPrice; if (OrderType()==OP_BUY) { if (_Step_Use) { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig)) { SLPrice=NormalizeDouble(Ask-_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } else { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig)) { SLPrice=NormalizeDouble(Bid+_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } } } }} void OnTick() {//--- double lot=Lot_Normalize(Symbol(),Lot,1); double sl= Dist_Normalize(Symbol(),tral); double step=Dist_Normalize(Symbol(),tral_step); double otstup=NormalizeDouble(otstups,Digits); int ord[8]; Uchet_Orderov_Function(Symbol(),Magic,ord); if(ord[7]==2 && ord[6]==0 && Volume[0]==1) { Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie); if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==0 && ord[7]==0 && Volume[0]==1) { if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } }//+------------------------------------------------------------------+// Средняя волятильность свечей//+------------------------------------------------------------------+ double Volatility(int _period){ double summ=0; for (int i=1; i<=_period; i++) { summ+=MathAbs(High[i]-Low[i]); } return(NormalizeDouble(summ/_period,Digits)); }//+------------------------------------------------------------------+// Нормализация лота для любых брокеров//+------------------------------------------------------------------+ double Lot_Normalize(string _Symvol, double _lot, double _mult){ double minlot = MarketInfo(_Symvol,MODE_MINLOT); double maxlot = MarketInfo(_Symvol,MODE_MAXLOT); double steplot = MarketInfo(_Symvol,MODE_LOTSTEP); double lot=_lot*_mult; if (lot<=minlot)lot=minlot; else if(lot>=maxlot) lot=maxlot; else if (lot>minlot && lot<maxlot) { int k=int((lot-minlot)/steplot); lot=NormalizeDouble(minlot+k*steplot,2); } return(lot);} double Dist_Normalize(string _Simvol, int _Distancia){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); double Pip=MarketInfo(_Simvol,MODE_POINT); if(Dig==3 || Dig==5) return NormalizeDouble(_Distancia*5*Pip,Dig); else return NormalizeDouble(_Distancia*Pip,Dig); }//+------------------------------------------------------------------+// Учет ордеров//+------------------------------------------------------------------+ void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){ ArrayInitialize(_Mas,0); int Ticket=-1; for (int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderTicket()!=Ticket) { Ticket=OrderTicket(); switch(OrderType()) { case 0:{_Mas[0]++;_Mas[6]++;break;} case 1:{_Mas[1]++;_Mas[6]++;break;} case 2:{_Mas[2]++;_Mas[7]++;break;} case 3:{_Mas[3]++;_Mas[7]++;break;} case 4:{_Mas[4]++;_Mas[7]++;break;} case 5:{_Mas[5]++;_Mas[7]++;break;} } } }} void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie){ for(int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic) { if(OrderType()>1) { if (!OrderDelete(OrderTicket(),clrNONE)) Alert("Ошибка при удалении отложенного ордера!" , GetLastError()); } else { if (OrderType()==OP_BUY) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } else { if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } } }}} I will write an Questions from Beginners MQL4 初心者の方からの質問 MQL4 MT4 MetaTrader Rustam Ayupov 2015.05.10 04:07 #204 khorosh: 買い指値は価格より下に、売り指値は価格より上にしか設定できないことを考慮に入れていないのでは?あなたが提案するものには、ストップオーダーを 使用する必要があります。同感です。私の分かりにくいアルゴリズムを理解していただきありがとうございます。ペンダントの名前にまだ迷いが...。 ストップワンをさせる、EAを作ってみるのもいいかも?後でテストして、どうなるかをお見せします。...あるいは、私がアメリカを発見したわけではないのですが、リンクを教えてください。 Vitalii Ananev 2015.05.10 04:50 #205 MIR_KAZAN:テスト条件はすべて正しく設定できたと思います。input int Magic = 12; // Магический номер ордеров input int Proskalzivanie = 5; // Проскальзывание input int period = 200; // Количество свечей для анализа волятильности input int tral = 20; // Дистанция траллинга в пунктах input int tral_step = 3; // Шаг срабатывания траллинга input bool use_step = true; // Использовать шаг input double Lot = 0.01; // Лот input double otstups = 0.0006; // Отступ от цены//+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+ int OnInit() {//--- return(INIT_SUCCEEDED); }//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+ void OnDeinit(const int reason) {//--- return; }//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+ void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); for (int pos=OrdersTotal()-1; pos>=0; pos--) { if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderType()<2) { double SLPrice; if (OrderType()==OP_BUY) { if (_Step_Use) { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig)) { SLPrice=NormalizeDouble(Ask-_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } else { RefreshRates(); if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig)) { SLPrice=NormalizeDouble(Bid+_Tral,Dig); if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed)) Alert("Ошибка модификации ордера: ",GetLastError()); } } } } }} void OnTick() {//--- double lot=Lot_Normalize(Symbol(),Lot,1); double sl= Dist_Normalize(Symbol(),tral); double step=Dist_Normalize(Symbol(),tral_step); double otstup=NormalizeDouble(otstups,Digits); int ord[8]; Uchet_Orderov_Function(Symbol(),Magic,ord); if(ord[7]==2 && ord[6]==0 && Volume[0]==1) { Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie); if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==0 && ord[7]==0 && Volume[0]==1) { if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1|| OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1) Print("Ошибка установки ордеров",GetLastError()); } if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } }//+------------------------------------------------------------------+// Средняя волятильность свечей//+------------------------------------------------------------------+ double Volatility(int _period){ double summ=0; for (int i=1; i<=_period; i++) { summ+=MathAbs(High[i]-Low[i]); } return(NormalizeDouble(summ/_period,Digits)); }//+------------------------------------------------------------------+// Нормализация лота для любых брокеров//+------------------------------------------------------------------+ double Lot_Normalize(string _Symvol, double _lot, double _mult){ double minlot = MarketInfo(_Symvol,MODE_MINLOT); double maxlot = MarketInfo(_Symvol,MODE_MAXLOT); double steplot = MarketInfo(_Symvol,MODE_LOTSTEP); double lot=_lot*_mult; if (lot<=minlot)lot=minlot; else if(lot>=maxlot) lot=maxlot; else if (lot>minlot && lot<maxlot) { int k=int((lot-minlot)/steplot); lot=NormalizeDouble(minlot+k*steplot,2); } return(lot);} double Dist_Normalize(string _Simvol, int _Distancia){ int Dig=int(MarketInfo(_Simvol,MODE_DIGITS)); double Pip=MarketInfo(_Simvol,MODE_POINT); if(Dig==3 || Dig==5) return NormalizeDouble(_Distancia*5*Pip,Dig); else return NormalizeDouble(_Distancia*Pip,Dig); }//+------------------------------------------------------------------+// Учет ордеров//+------------------------------------------------------------------+ void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8]){ ArrayInitialize(_Mas,0); int Ticket=-1; for (int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()==_Magic && OrderTicket()!=Ticket) { Ticket=OrderTicket(); switch(OrderType()) { case 0:{_Mas[0]++;_Mas[6]++;break;} case 1:{_Mas[1]++;_Mas[6]++;break;} case 2:{_Mas[2]++;_Mas[7]++;break;} case 3:{_Mas[3]++;_Mas[7]++;break;} case 4:{_Mas[4]++;_Mas[7]++;break;} case 5:{_Mas[5]++;_Mas[7]++;break;} } } }} void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie){ for(int pos=OrdersTotal()-1; pos>=0; pos--) { if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic) { if(OrderType()>1) { if (!OrderDelete(OrderTicket(),clrNONE)) Alert("Ошибка при удалении отложенного ордера!" , GetLastError()); } else { if (OrderType()==OP_BUY) { if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } else { if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE)) Alert("Ошибка закрытия ордера! ",GetLastError()); } } }}}あなたのコードは解析に適していないため、お役に立てないかもしれません。もしかしたら、あなたの理解を深めるためにコメントを加えるかもしれません。ord[]配列が何に使われ、どのようなデータを格納するのかが不明である。私はあなたのコードをこのように理解しました:毎ティック、配列に注文タイプを書く(Uchet_Orderov_Function(Symbol(),Magic,ord);)。で、if(ord[7]==2 && ord[6]==0 && Volume[0]==1) という条件をチェックし、それが真であれば、保留中の注文は削除さ れ、すべてのポジションが決済されます。そして、if (ord[6]==0 && ord[7]==0 && Volume[0]==1) という条件を確認し、それが真であれば、2つの保留注文が開設されます。しかし、ord[]配列の値は、(ord[6]==0 && ord[7]==0 && Volume[0]==1) の条件をチェックする前に更新されることはありません。そして、2回目のティック時にのみ更新されます。 そのため、そのロジックに影響を与えるord[]配列のすべての値を記録する必要があります。このコードにも注目してください。 if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } ソフトウェアの括弧が抜けていると思います{ .こんな感じでいいんじゃないでしょうか。 if (ord[6]==1) { Trailing_Stop(Symbol(),Magic,sl,step,use_step); for(int i=OrdersTotal()-1; i>0; i++) { if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1) if (!OrderDelete(OrderTicket(),clrNONE)) Print("Ошибка удаления ордера!: ", GetLastError()); } } Victor Nikolaev 2015.05.10 10:34 #206 Vitalii Ananev:また、このコードの一部にも注目してください。 ブラケット{が抜けているのでは?こうなるはずなんです。この場合、括弧は動作(ロジック)に影響を与えません。エラーはありません Vitalii Ananev 2015.05.10 11:14 #207 Victor Nikolaev: この場合、括弧は動作(ロジック)に影響を与えません。エラーはありません。 違うかもしれませんが、読みやすくなりました。 khorosh 2015.05.10 20:55 #208 akarustam:同感です。私の分かりにくいアルゴリズムを理解していただきありがとうございます。ペンダントの名前にまだ迷いが...。 ストップワンをさせる、EAを作ってみるのもいいかも?後でテストして、どうなるかをお見せします。...あるいは、私がアメリカを発見したわけでもないのに、そのリンクを教えてください。 何かを提案するには、少なくとも初歩的な知識を持っていなければなりません。シンプルなアイデアはすべてとっくに試されているのに、あなたは本当にアメリカを発見していないのです。しかし、フォーラムやkodobaseのありそうもない人を通じてリンクするためにあなたを探します。必要だから、探す。それとも、あらゆるExpert Advisorやスクリプト、インジケータへのリンクを頭の中に入れている人がいるのでしょうか? Rustam Ayupov 2015.05.10 21:50 #209 khorosh: 少なくとも基本的な知識がなければ、何かを提案することはできません。すべてのシンプルなアイデアは、長い間試されてきたし、実際、あなたはアメリカを発見していない。しかし、フォーラムやkodobaseであなたのためにリンクを探す人はまずいないでしょう。必要だから、探す。それとも、いろいろなExpert Advisorやスクリプト、インジケータへのリンクを頭の中に入れている人がいるのでしょうか?...想定しています。 4iterOk 2015.05.14 11:18 #210 (アイデアがあるんだ、助けてくれ))Expert Advisorを作成する長い間、取引に使っています。1つの通貨ペアで毎月1000pipsを獲得しています。こ のような取引に慣れたことはない。ドローダウンは最大5pipsと、実質的にゼロです。タイムフレーム H41.MA4/simpleclose2.MA5/simple/openの場合動作原理は次のようになるはずです。テイクプロフィット、ストップロス なし。クロスオーバーの時だけオープン・クローズ・トレードを行う。例えば、下から上へクロスして注文を出し、クロスして戻ってきたときだけ注文を閉じる。買い注文を閉じる逆信号があれば、売り注文を開く。一般的に、私はあなたが理解してほしい)戦略では、それも重要な利益ではありませんが、これらのクソクロスオーバー)このような)長い時間のためにこの戦略で取引、利益は良いですが、私はこの戦略エキスパートアドバイザーを書くために考えるので、難しいことではないでしょう。もし、あなたが手伝ってくれるなら、これが私のメールです。4iterRrock@mail.ru以下は、私が1年近く取引しているパターンである。 ファイル: MAxi2r.tpl 2 kb 1...141516171819202122232425262728...171 新しいコメント 取引の機会を逃しています。 無料取引アプリ 8千を超えるシグナルをコピー 金融ニュースで金融マーケットを探索 新規登録 ログイン スペースを含まないラテン文字 このメールにパスワードが送信されます エラーが発生しました Googleでログイン WebサイトポリシーおよびMQL5.COM利用規約に同意します。 新規登録 MQL5.com WebサイトへのログインにCookieの使用を許可します。 ログインするには、ブラウザで必要な設定を有効にしてください。 ログイン/パスワードをお忘れですか? Googleでログイン
D1ローソク足の始値で取引を開始するということですか?その場合、Expert Advisorのロジックに、指定した時間帯にのみ取引を開始する条件を指定します。
もう一つの質問ですが、価格から+15pipsのところにbuystopとsellstopという二つの保留注文を設定しました。そして、ティックごとに新しい価格に移動させる。急激な値動き(特にニュース時)に価格が触れた途端、端末がハングアップしてしまうのです。(なぜフリーズするのか?
なぜハングアップするのか、私は超能力者ではありません、Expert Advisorのコードに対処してください。注文が執行された後、EAがその注文を新しい価格に移動させようとしますが、保留中の注文が すでに市場にあるため、EAがハングアップしていると推測できます。Expert Advisor の主要な変数の状態をログに表示し、その動作ロジックを解析してみましょう。
なぜハングアップするのか、私は超能力者ではありません、Expert Advisorのコードに対処してください。注文が執行された後、EAがその注文を新しい価格に移動させようとしますが、保留中の注文が すでに市場にあるため、EAがハングアップしていると推測できます。EAの主要な変数の状態をログに表示し、EAの動作のロジックを分析してみてください。
すべての条件を正しく設定したつもりです。
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
買い指値は価格より下に、売り指値は価格より上にしか設定できないことを考慮に入れていないのでは?あなたが提案するものには、ストップオーダーを 使用する必要があります。
同感です。私の分かりにくいアルゴリズムを理解していただきありがとうございます。ペンダントの名前にまだ迷いが...。
ストップワンをさせる、EAを作ってみるのもいいかも?
後でテストして、どうなるかをお見せします。
...あるいは、私がアメリカを発見したわけではないのですが、リンクを教えてください。
テスト条件はすべて正しく設定できたと思います。
input int Magic = 12; // Магический номер ордеров
input int Proskalzivanie = 5; // Проскальзывание
input int period = 200; // Количество свечей для анализа волятильности
input int tral = 20; // Дистанция траллинга в пунктах
input int tral_step = 3; // Шаг срабатывания траллинга
input bool use_step = true; // Использовать шаг
input double Lot = 0.01; // Лот
input double otstups = 0.0006; // Отступ от цены
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
return;
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void Trailing_Stop(string _Simvol, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if (OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if (OrderType()==OP_BUY)
{
if (_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Ошибка модификации ордера: ",GetLastError());
}
}
}
}
}
}
void OnTick()
{
//---
double lot=Lot_Normalize(Symbol(),Lot,1);
double sl= Dist_Normalize(Symbol(),tral);
double step=Dist_Normalize(Symbol(),tral_step);
double otstup=NormalizeDouble(otstups,Digits);
int ord[8];
Uchet_Orderov_Function(Symbol(),Magic,ord);
if(ord[7]==2 && ord[6]==0 && Volume[0]==1)
{
Udalenie_Orderov_I_Sdelok(Symbol(),Magic, Proskalzivanie);
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==0 && ord[7]==0 && Volume[0]==1)
{
if (OrderSend(Symbol(),OP_BUYSTOP,lot,Ask+otstup, Proskalzivanie,Ask+otstup-sl,0,NULL,Magic,0,clrBlue)==-1||
OrderSend(Symbol(),OP_SELLSTOP,lot,Bid-otstup, Proskalzivanie,Bid-otstup+sl,0,NULL,Magic,0,clrRed)==-1)
Print("Ошибка установки ордеров",GetLastError());
}
if (ord[6]==1)
{
Trailing_Stop(Symbol(),Magic,sl,step,use_step);
for(int i=OrdersTotal()-1; i>0; i++)
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Magic && OrderSymbol()==Symbol() && OrderType()>1)
if (!OrderDelete(OrderTicket(),clrNONE))
Print("Ошибка удаления ордера!: ", GetLastError());
}
}
//+------------------------------------------------------------------+
// Средняя волятильность свечей
//+------------------------------------------------------------------+
double Volatility(int _period)
{
double summ=0;
for (int i=1; i<=_period; i++)
{
summ+=MathAbs(High[i]-Low[i]);
}
return(NormalizeDouble(summ/_period,Digits));
}
//+------------------------------------------------------------------+
// Нормализация лота для любых брокеров
//+------------------------------------------------------------------+
double Lot_Normalize(string _Symvol, double _lot, double _mult)
{
double minlot = MarketInfo(_Symvol,MODE_MINLOT);
double maxlot = MarketInfo(_Symvol,MODE_MAXLOT);
double steplot = MarketInfo(_Symvol,MODE_LOTSTEP);
double lot=_lot*_mult;
if (lot<=minlot)lot=minlot;
else if(lot>=maxlot) lot=maxlot;
else if (lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
double Dist_Normalize(string _Simvol, int _Distancia)
{
int Dig=int(MarketInfo(_Simvol,MODE_DIGITS));
double Pip=MarketInfo(_Simvol,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*5*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
//+------------------------------------------------------------------+
// Учет ордеров
//+------------------------------------------------------------------+
void Uchet_Orderov_Function(string _Simvol, int _Magic, int &_Mas[8])
{
ArrayInitialize(_Mas,0);
int Ticket=-1;
for (int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol &&
OrderMagicNumber()==_Magic && OrderTicket()!=Ticket)
{
Ticket=OrderTicket();
switch(OrderType())
{
case 0:{_Mas[0]++;_Mas[6]++;break;}
case 1:{_Mas[1]++;_Mas[6]++;break;}
case 2:{_Mas[2]++;_Mas[7]++;break;}
case 3:{_Mas[3]++;_Mas[7]++;break;}
case 4:{_Mas[4]++;_Mas[7]++;break;}
case 5:{_Mas[5]++;_Mas[7]++;break;}
}
}
}
}
void Udalenie_Orderov_I_Sdelok(string _Simvol, int _Magic, int _Proskalzivanie)
{
for(int pos=OrdersTotal()-1; pos>=0; pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==_Simvol && OrderMagicNumber()== _Magic)
{
if(OrderType()>1)
{
if (!OrderDelete(OrderTicket(),clrNONE))
Alert("Ошибка при удалении отложенного ордера!" , GetLastError());
}
else
{
if (OrderType()==OP_BUY)
{
if(!OrderClose(OrderTicket(),OrderLots(),Bid,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
else
{
if(!OrderClose(OrderTicket(),OrderLots(),Ask,_Proskalzivanie,clrNONE))
Alert("Ошибка закрытия ордера! ",GetLastError());
}
}
}
}
}
あなたのコードは解析に適していないため、お役に立てないかもしれません。もしかしたら、あなたの理解を深めるためにコメントを加えるかもしれません。ord[]配列が何に使われ、どのようなデータを格納するのかが不明である。私はあなたのコードをこのように理解しました:毎ティック、配列に注文タイプを書く(Uchet_Orderov_Function(Symbol(),Magic,ord);)。で、if(ord[7]==2 && ord[6]==0 && Volume[0]==1) という条件をチェックし、それが真であれば、保留中の注文は削除さ れ、すべてのポジションが決済されます。そして、if (ord[6]==0 && ord[7]==0 && Volume[0]==1) という条件を確認し、それが真であれば、2つの保留注文が開設されます。しかし、ord[]配列の値は、(ord[6]==0 && ord[7]==0 && Volume[0]==1) の条件をチェックする前に更新されることはありません。そして、2回目のティック時にのみ更新されます。
そのため、そのロジックに影響を与えるord[]配列のすべての値を記録する必要があります。
このコードにも注目してください。
ソフトウェアの括弧が抜けていると思います{ .こんな感じでいいんじゃないでしょうか。
また、このコードの一部にも注目してください。
ブラケット{が抜けているのでは?こうなるはずなんです。
この場合、括弧は動作(ロジック)に影響を与えません。エラーはありません
この場合、括弧は動作(ロジック)に影響を与えません。エラーはありません。
同感です。私の分かりにくいアルゴリズムを理解していただきありがとうございます。ペンダントの名前にまだ迷いが...。
ストップワンをさせる、EAを作ってみるのもいいかも?
後でテストして、どうなるかをお見せします。
...あるいは、私がアメリカを発見したわけでもないのに、そのリンクを教えてください。
少なくとも基本的な知識がなければ、何かを提案することはできません。すべてのシンプルなアイデアは、長い間試されてきたし、実際、あなたはアメリカを発見していない。しかし、フォーラムやkodobaseであなたのためにリンクを探す人はまずいないでしょう。必要だから、探す。それとも、いろいろなExpert Advisorやスクリプト、インジケータへのリンクを頭の中に入れている人がいるのでしょうか?
(アイデアがあるんだ、助けてくれ))Expert Advisorを作成する
長い間、取引に使っています。1つの通貨ペアで毎月1000pipsを獲得しています。こ のような取引に慣れたことはない。ドローダウンは最大5pipsと、実質的にゼロです。
タイムフレーム H4
1.MA4/simpleclose
2.MA5/simple/openの場合
動作原理は次のようになるはずです。テイクプロフィット、ストップロス なし。クロスオーバーの時だけオープン・クローズ・トレードを行う。例えば、下から上へクロスして注文を出し、クロスして戻ってきたときだけ注文を閉じる。買い注文を閉じる逆信号があれば、売り注文を開く。一般的に、私はあなたが理解してほしい)戦略では、それも重要な利益ではありませんが、これらのクソクロスオーバー)このような)長い時間のためにこの戦略で取引、利益は良いですが、私はこの戦略エキスパートアドバイザーを書くために考えるので、難しいことではないでしょう。
もし、あなたが手伝ってくれるなら、これが私のメールです。4iterRrock@mail.ru
以下は、私が1年近く取引しているパターンである。