externdouble Lots=0.03;// Жестко заданное колич. лотов.................................// Учёт количества имеющихся ордеров
Symb=Symbol();// Название фин.инстр.
BuyTotalOp=0;// Количество Buy ордеров
SellTotalOp=0;// Количество Sell ордеровfor(int i=1; i<=OrdersTotal(); i++)// Цикл перебора ордер{if(OrderSelect( i-1, SELECT_BY_POS)==true)// Если есть следующий{// Анализ ордеров:if(OrderSymbol()!= Symb)continue;// Не наш фин. инструмif(OrderType()>1)// Попался отложенный{Alert("Обнаружен отложенный ордер. Эксперт не работает.");return;// Выход из start()}if(OrderType()==OP_BUY){
BuyTotalOp++;// Счётчик ордеров Buy......................................//Проверка если открыто несколько БАЙ-позицийif(OrderType()==OP_BUY&& BuyTotalOp>1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия нескольких лотов БАЙif( BuyOrdProf>0){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, Lots,Bid,0,Red);// Закрытие Buyif( Ans==true)// Получилось :){Alert("Закрыт ордер Buy ", TicketCl);break;// Выход из цикла закр}if( Fun_Error(GetLastError())==1)// Обработка ошибокcontinue;// Повторная попыткаreturn;// Выход из start()}}//.........................................//Проверка если открыта одна БАЙ-позицияif(OrderType()==OP_BUY&& BuyTotalOp==1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия одного лота БАЙif( BUYCLOSE_1PART && BuyClLot== Lots){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, LotCloseBuy/3,Bid,0,Red);// Закрытие Buyif( Ans==true)// Получилось :){Alert("Закрыт ордер Buy ", TicketCl);break;// Выход из цикла закр}if( Fun_Error(GetLastError())==1)// Обработка ошибокcontinue;// Повторная попыткаreturn;// Выход из start()}
// Учёт количества имеющихся ордеров от начала к концу
Symb=Symbol();// Название фин.инстр.
BuyTotalOp=0;// Количество Buy ордеров
SellTotalOp=0;// Количество Sell ордеровfor(int i=1; i<=OrdersTotal(); i++)// Цикл перебора ордер{if(OrderSelect( i-1, SELECT_BY_POS)==true)// Если есть следующий{// Анализ ордеров:if(OrderSymbol()!= Symb)continue;// Не наш фин. инструмif(OrderType()>1)// Попался отложенный{Alert("Обнаружен отложенный ордер. Эксперт не работает.");return;// Выход из start()}if(OrderType()==OP_BUY){
BuyTotalOp++;// Счётчик ордеров Buy....................................
//Проверка если открыто несколько БАЙ-позицийif(OrderType()==OP_BUY&& BuyTotalOp>1)// Тип ордера бай и ордеров по циклу "с начала" = 1{//.................................... //---- если условия закрытия нескольких лотов БАЙif( BuyOrdProf>0){//---- закрываем 1-ю часть позицииAlert("Попытка закрыть Buy ", TicketCl,". Ожидание ответа..");RefreshRates();// Обновление данных
Ans=OrderClose( CloseTicketCl, BuyTotalOp,Bid,0,Red);// Закрытие Buy...................................................................
イゴール、ヒントをくれないか?EAのインジケータ(iMA)の値が小数点以下4桁なのですが、仕事上5桁が必要なのです。NormalizeDouble(iMA,Digits) を試してみましたが、やはり小数点以下が4桁になってしまいます。5桁にするためには、Expert Advisorのサブプログラム関数にインジケータ全体を書き換える必要があるのでしょうか?
ヘルプ: Alert()、Comment()、Print()
double 型のデータは、小数点以下4桁で出力されます。
DoubleToStr() を使って、より精度の高い数値を出力することができます。
こんばんは。
ポジションを 正しく閉じることができないので、対応できない。1.1つのポジションが開いている場合、2.2つ(またはそれ以上)のポジションが開いている場合、の2つの条件で決済されます。どちらの場合も、ロットボリューム=0.03です。最初のケースでは、0.01(上の書き込みで計算)だけ別にロットを閉じます。2番目のケースでは、2つのロットは0.03で両方閉じる必要があります。
であれば、最初のバリアントであるclosingとif。
であれば、もう一方のポジションを決済します(私の変形(予備)では、両方のポジションの利益の合計>0であれば、両方のポジションを決済すべきです)。こんな感じです。
実際、両方のロットを閉じる条件が現れたとき、1番目のロットは完全に閉じ、2番目のロットは閉じる条件BuyTotalOp==1を「引き継ぎ」、自分の条件に従って閉じることが判明しました。
クロージング条件のどこが悪いのか、どうすれば2区画とも一度にクロージングできるのか、アドバイスをお願いします。ありがとうございました。
フライとカツを切り分ける...便利な機能を書く...。
例えば、注文の種類ごとに未決済注文の数を数える、注文の種類ごとに決済注文を数える、などなど...。
そうすれば、すべてが簡単になる......。
...というのは、どこかに } があって、具体的に何が行われているのかが不明だからです。一時的に注文 数をカウントしてすぐに削除しようとしているのか、それとも? 保留注文は、存在しても中断せず、スキップしたほうがいいのでは?
良いオプションは、与えられた条件に従って、あなたがそれらを介して実行し、閉じることができるオープンオーダーのパラメータと配列を形成するであろう関数であろう...一般的に、構造上の作業...
keekkenenさん、ありがとうございます!最近、配列を作ろうと思っていたところなんです。ただ、私は仕事をしたことがないので、もっと簡単な解決策があればいいなと、すでに「閉じた目」になってしまっていて、新鮮な目を持った人が見て、「げっ、どこにソレを数えるんだ...」と言われるのがオチです。さて、ループ内の買い注文はすべて計算済みです。
とかOrderCloseが カウントされないとか・・・。
まあ、そうなんですが、明らかに「やりすぎ」です・・・・・・。と、正直言ってこれは理解できない。
で、これは特にロットを3分割しているのですが、注文は開いたときと同じロットでクローズされます...。
なぜ両方ともダメなのか?
なぜ両方ともダメなのか?
CloseTicketCl =OrderTicket ()一般的にはこうすればいいのですが...。
と、これ、特にロットを3で割ると ?注文は開いたときと同じロットでクローズされる...
同じではない
。ロットの3分の1がクローズされます(条件の1つにより、価格が+150pipsに達したとします)。2番目の3分の1は、例えば、オープニングから+300pipsの時にクローズする、など。
と率直に言って、私はこの
ここ Lots と OrderLots() そう、同じものなのだ、ということが理解できない。1つの注文 - 1つのロット、3つのロットで注文を開いた場合、どのような方法でもロットを分割することはできません - 最初に1、次に1、次に1 - 注文はロット全体を閉じます、すなわち、注文はそれが開かれたのと同じロットで閉じます、あなたは部分的に注文を閉じることはできません...。