トップ  >  お問合せ(Contact)  >  バックテスト中にヒストリカルデータを先読みする悪質な詐欺EA(DOPE.mq4)
バックテスト中にヒストリカルデータを先読みする悪質な詐欺EA(DOPE.mq4)
問い合わせであった詐欺EAのソースコードです。 バックテスト中にヒストリカルデータを先読みするロジックが組み込まれている為、バックテストの結果だけ見ると必ず勝てているような結果になります。




無限ナンピン&無限Lot増をしているにも関わらず、
何故か有効証拠金が減らない、何故か強制ロスカットにならない、
ソースコードを変更しても何故か必ず勝つ摩訶不思議なEAです。

(↑このバックテスト結果から違和感を感じない人は、絶対に自動売買はしないで下さい。あっという間に破産します。)

あまりにも不自然過ぎる結果にしかならない怪し過ぎるEAです。
ただ残念な事にこの不自然過ぎる結果にしかならないEAに対して全く疑問を持たないで聖杯だと勘違いしてしまうB層のような人がいるみたいです。 海外のフォーラムで絶賛されているらしいので一体どれだけの人が騙されているのやら・・・w
何故無限に勝てる(と思わせるように仕組まれた)EAを自分で運用しないで販売している人が生活出来るのか良く分かる構図ですね。
そもそも無限に勝てるなら他人に売る必要はありません、市場から無限に抜き取って下さい。
現実の流通市場にある注文数は有限なので現実的には無限に勝つ事は物理的に不可能ですが(←多分これも何を言っているか理解できない人が結構いると思います)。

こんな事を書くとまたEA販売を生業としている人から「営業妨害だ!」とクレームが来ると思いますが、 どうせこういうEAを買ったり崇拝するような人はこんなサイトを見る事は無いので安心して下さい。
仮にカモがこのサイトをみたとしても、このバックテスト結果に違和感を感じないで聖杯だと思って必死に使いたがる、 聖杯否定論が目に入らない・聞く耳持たない思考停止状態で既に信者化している筈ですので問題ありません。
このサイトの内容を理解できる人は、もともとカモに成り得ない人なので営業妨害にはなりません。
安心して下さい、カモはきっと性懲りも無くEAを買ってくれます。

その証拠に


ほら、ちょっとヤフオクで検索しただけでも、得体の知れないEAを買っているカモ達は今も尚健在ですw
ヤフオクで売っているEAが詐欺かどうかが問題なのでは無く、良く分からないものを有難がって購入する思考停止したカモの行動が問題です (また「営業妨害だ!」とクレームと嫌がらせが来るかもしれないのでフォローを入れておきました)。

100年前にも得体の知れない情報を有難がって買うカモがいたように、現代でも得体の知れないEAを有難がって買うカモは必ず存在します。
彼らは自分で物事を考えない、自分で意思決定が出来ない、共同体帰属意識・同調圧力・多数派同調バイアスに翻弄され続けた人生を歩んで来ている筈ですので思考停止状態になっている人ばかりです。 論理的思考・合理的判断力・状況判断力が完全に欠如しています。その為、得体の知れないものに金を払いそしてその行為を自己正当化する為に信者化します。


サンクコスト効果の良い例です、情報やEAを購入した人は信者化するので破産しても「新しいEAを売って下さい」と言って借金をしてでもEAを買ってくれるでしょう。
ほら、買った株や通貨が値下がりしたら「勿体ない」と思ってナンピンして更に資金を投入して傷口を広げる人が多いですよね?それと同じです。 「配当やスワップ金利があるから」と損切りしない言い訳をして意思決定を回避している人も同様です。
上がる筈の相場が下がったら普通は損切りの一択しかないのですが、彼らは自分を間違いを認めず「勿体ない」という事に思考を支配されているので損切りなんて出来ません。
セリングクライマックスで暴落した時にようやく狼狽売り(または強制ロスカット)をし、 更に慌ててドテン売りまでします、セリングクライマックスでの暴落で付けた安値が大底になる事が多いのでここから急反発します。



急反発した所で売りポジションの損があっという間に膨らんで慌てて損切りして、急反発した事で慌ててドテン買いをします。 ドテン買いをした所でまた急落して暴落時の安値を割れた瞬間に狼狽売りをします。往復ビンタの連続で疑心暗鬼になってもうトレードしなくなります。 でもここから反発上昇し始めて、結局暴落する前の水準まで価格が戻り、そこから更に上昇します(普通はセリクラで乱高下した所で買って急反発(この時の急反発は1日程度(長くても2日程)しか上昇しない)した所で決済し、 もう一度急落した後の2回目の反発上昇でスイング買いを入れるのがセオリー、このスイング買いは高値圏で暴騰するか2回下がる(ダブルトップ形成する)までホールドし続ける。天井で掴まされて大底で狼狽売りさせられる人と、大底付近で買って天井付近で売り抜けられる人の違いです。)。
すると「損切りしなければ良かった・・・」と思います。この経験から更に塩漬けをするようになります。 そして下落した銘柄を性懲りも無く塩漬けし、またセリクラの暴落時に狼狽売りします。
金融商品は塩漬けしてもそれを美味しく頂くのは塩漬けした張本人ではありません、相場操縦をする人たちが一番美味しくなったその瞬間に大事に漬け続けたものを全て奪いとって美味しく頂きます。
大切に塩漬けした人達は二束三文で売り払ってしまい、時間とお金を無駄に消失させます。
大底圏で一気に狼狽売りさせて安くなった所を一気に買い集める為、大底での出来高が急騰します。


出来高の推移を観察する事の重要性が良く分かるチャートです。


この鉄板パターンは100年前の株式市場から全く変っていません。
変わり続けているのはカモ(相場で負ける人・得体の知れない情報等を買う人)の顔ぶれだけです。
AIやHFT?100年前とは取引環境が全く異なるから現代と一緒にするな!?って??
取引環境が異なってもカモの行動パターンは100年前から何も進歩していません。
相場で利益を出す為に必要な事は何一つ変化していません、
それは意味の分からないものを高値で買って、同様に意味を分かっていない大馬鹿野郎にもっと高値で売りつける事です。 タイミングによっては自分が大馬鹿野郎になります。自分が大馬鹿野郎のカモにされていると気がついたら損失が膨らむ前に損切りする、相場というのはそういうゲームです。 どんなに取引環境が変わっても大馬鹿野郎のカモが利益を出す為に必要な重要な鍵である事は変わりません。もし大馬鹿野郎のカモがいなければブローカーだけが手数料で儲かるだけの夢の無い世界になります。

彼ら(大馬鹿野郎のカモ)は一生気が付くことはありません、セリングクライマックスの暴落やセリクラまでの下落トレンドは相場操縦で意図的に起こされているものだという事を・・・
彼らは現実的で厳しい事を言ってくる人を毛嫌いし、「楽して儲かる」と吹聴して優しく接してきて搾取してくる人間の方を好みます。
だから安心して下さい。営業妨害にはなりませんw


そういえば地合いが悪い時はセリングクライマックスだけを狙って逆張りする億トレーダーがいましたね。
セリクラで買える人は、セリクラになるまでノーポジで我慢する事が出来る人です。セリクラの前に買って暴落して大きな含み損を抱えている人は冷静な判断は出来ず疑心暗鬼になります。
多くの人がとにかくポジションを持ちたがる・・・自称スロプロの借金王はひたすらパチンコ屋に通い、とりあえず台に座って打って毎日のように負けていました。 ただのギャンブル依存症です。パチンコ屋も控除率でお金を稼いでいるので、何も考えずに毎日打ってくれる人は大歓迎でしょうね。 逆に控除率を考慮して、毎日通っているのにデータだけ取って帰って、たまに台に座って打った時に必ず勝って帰る人は厄介でしょうね。 お店側としては打ち子を雇って、意図した日に大勝ちしている人がいる事をアピールしたいでしょうから。


詐欺EAの話に戻りますが、ソースコードを見ると何故かdllが使用されていました。



理由は簡単で、バックテスト中にヒストリカルデータを先読みして必ず勝つようにする為です。
dllのライブラリを使ってデータをヒストリカルデータを先読みするロジック部分の1行をコメントアウトすると



本来の結果が現れます。


見ての通り、本当の結果は破産一直線です。
無限ナンピンしていればこの形になるのが普通です。
通常ナンピンをすると残高と有効証拠金が乖離(基本的には有効証拠金が下)するので、この結果は正常に動作している事が分かります (←これも何を言っているか理解できない人は本当にEAを使わないで下さい、あっという間に破産します)。
ヒストリカルデータを先読みされたEAは常に勝つため有効証拠金が上にしか乖離していないので明らかに操作されている事が目視出来ます。
そしてちゃんとセオリー通りに破産してバックテストが中断されました。

Lotが右肩下がりになっている理由は、余剰証拠金に合わせてLot調整されているのですが、
常に勝つようにカンニング取引されている時は余剰証拠金が減らない為、Lotが右肩上がりになっていました。

当然ですがバックテスト中のデータはローカルデータなので幾らでもヒストリカルデータを先読みをできますが、
デモ口座のフォワードテストやライブ口座の実際の取引では配信レートで取引するので、データの先読みをする事は出来ません。
タイムマシンに改造されたデロリアンを持っているのであれば話は別です。


詐欺EAのソースコード

バックテスト結果にヒストリカルデータを先読みする詐欺EAのソースコード:
  //+------------------------------------------------------------------+
  //|                                                         DOPE.mq4 |
  //|                                             xiaofeeiyucc@126.com |
  //|                                            xiaofeeiyucc@126.com|
  //+------------------------------------------------------------------+
  #property copyright "xiaofeeiyucc@126.com"
  #property link      "xiaofeeiyucc@126.com"
  #property version   "V8.00"
  #property strict
  
  #include <stderror.mqh>
  #include <stdlib.mqh>
  
  #import   "kernel32.dll"
  int CreateFileW(string Filename,int AccessMode,int ShareMode,int PassAsZero,int CreationMode,int FlagsAndAttributes,int AlsoPassAsZero);
  int GetFileSize(int FileHandle,int PassAsZero);
  int SetFilePointer(int FileHandle,int Distance,int &PassAsZero[],int FromPosition);
  int ReadFile(int FileHandle,uchar &BufferPtr[],int BufferLength,int  &BytesRead[],int PassAsZero);
  int CloseHandle(int FileHandle);
  #import
  
  
  string Ordercomment="";
  int Slippage=3;
  
  int    Retries=10;
  
  bool   AutoTrade=true;
  
  bool   ecnBroker=false;
  
  input int MagicID=12345678;
  input double LOTS=0.01;
  input int risk=40;//risk: 0-->fixed lots
  input double SL=50;
  input double TP=100;
  extern bool Trailing = true;
  extern double TrailingExtra = 50.0;
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  union Price
    {
     uchar             buffer[8];
     double            close;
    };
  
  double data[][2];
  
  int BytesToRead;
  string    datapath;
  string    result;
  Price     m_price;
  
  double g_Point;
  int    ticket=0;
  //datetime expDate=D'2029.10.12 02:00';//yyyy.mm.dd
  //+------------------------------------------------------------------+
  //| Expert initialization function                                   |
  //+------------------------------------------------------------------+
  int OnInit()
    {
     if(!IsDllsAllowed())
       {
        Alert("Make Sure DLL Import is Allowed");
        ExpertRemove();
        return(INIT_FAILED);
       }
     ///if(TimeCurrent()>expDate)
       {
       /// MessageBox("The version has expired, contact forexea333@gmail.com");
        //ExpertRemove();
       /// return(INIT_FAILED);
       }
  
   
  //------------------------------------------------------
       {
        //---
        g_Point=Point;
        if(Digits==5 || Digits==3)
          {
           g_Point *= 10;
           Slippage*=10;
  
          }
        ChartSetInteger(0,17,0,0);
        ChartSetInteger(0,0,1);
        string account_server=AccountInfoString(3);
        if(account_server=="")
          {
           account_server="default";
          }
        datapath=TerminalInfoString(3)+"\\history\\"
                 +account_server+"\\"+Symbol()+"240"+".hst";
        ReadFileHst(datapath);
        //---
        return(INIT_SUCCEEDED);
       }
    }
  //+------------------------------------------------------------------+
  //| Expert deinitialization function                                 |
  //+------------------------------------------------------------------+
  void OnDeinit(const int reason)
    {
     ObjectsDeleteAll();
     ChartRedraw();
    }
  //+------------------------------------------------------------------+
  //| Expert tick function                                             |
  //+------------------------------------------------------------------+
  void OnTick()
    {
     static datetime previousBar;
     if(previousBar!=Time[0])
       {
        previousBar=Time[0];
        ChartRedraw();
       }
     else
       {
        return;
       }
  
     if(iVolume(Symbol(),PERIOD_H4,0)>iVolume(Symbol(),PERIOD_H4,1))
        return;
  //**********************************
  
     if(!BytesToRead>0)
        return;
  
     int pos = -1 ;
     for(int i = 0 ; i < BytesToRead - 1 ; i++)
       {
        if(!(data[i][0]<Time[0]))
           break;
        pos = i + 1;
       }
  
  //********************************
     HideTestIndicators(true);
     double wpr= iWPR(Symbol(),0,4,0);
     double ao = iAO(Symbol(),0,0);
     HideTestIndicators(false);
  
     double level=NormalizeDouble(data[pos][1],Digits);
     ObjectDelete("level");
     MakeLine(level);
  
     if(data[pos][1]>Open[0])
        Comment("BUY - ", data[pos][1]);
     if(data[pos][1]<Open[0])
        Comment("SELL - ", data[pos][1]);
  
     if(MarketInfo(Symbol(),MODE_SPREAD)>20)
        return;
  
     if(pos>0)
       {
  
        if(CheckMarketBuyOrders()<70 && CheckMarketSellOrders()<70)
          {
           if(data[pos][1]>Open[0])
  
              if(IsBuyPinbar())
                 //if(ao<0)
  
                {
                 double BuySL=NormalizeDouble(Ask - SL*g_Point,Digits);
                 double BuyTP=NormalizeDouble(Ask + TP*g_Point,Digits);
                 if(AccountFreeMarginCheck(Symbol(),OP_BUY,GetLots())>0)
                   {
                    ticket=OrderSend(Symbol(),OP_BUY,GetLots(),Ask,Slippage,BuySL,BuyTP,"",MagicID,0,clrGreen);
                    //MainOrders(0,Ask,BuyTP,BuySL);
                    CloseSell();
                   }
                }
  
           if(data[pos][1]<Open[0])
  
              if(IsSellPinbar())
                 //if(ao>0)
  
  
                {
                 double SellSL=NormalizeDouble(Bid + SL*g_Point,Digits);
                 double SellTP=NormalizeDouble(Bid - TP*g_Point,Digits);
                 if(AccountFreeMarginCheck(Symbol(),OP_SELL,GetLots())>0)
                   {
                    ticket=OrderSend(Symbol(),OP_SELL,GetLots(),Bid,Slippage,SellSL,SellTP,"",MagicID,0,clrGreen);
                    //MainOrders(1,Bid,SellTP,SellSL);
                    CloseBuy();
  
                   }
                }
          }
  
       }
     return;
    }
  //+------------------------------------------------------------------+
  void ReadFileHst(string FileName)
    {
     int       j=0;;
     string    strFileContents;
     int       Handle;
     int       LogFileSize;
     int       movehigh[1]= {0};
     uchar     buffer[];
     int       nNumberOfBytesToRead;
     int       read[1]= {0};
     int       i;
     double    mm;
  //----- -----
     strFileContents="";
     Handle=CreateFileW(FileName,(int)0x80000000,3,0,3,0,0);
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
     if(Handle==-1)
       {
        Comment("");
        return;
       }
     LogFileSize=GetFileSize(Handle,0);
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
     if(LogFileSize<=0)
       {
        return;
       }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
     if((LogFileSize-148)/60==BytesToRead)
       {
        return;
       }
     SetFilePointer(Handle,148,movehigh,0);
     BytesToRead=(LogFileSize-148)/60;
     ArrayResize(data,BytesToRead,0);
     nNumberOfBytesToRead=60;
     ArrayResize(buffer,60,0);
     for(i=0; i<BytesToRead; i=i+1)
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
       {
        ReadFile(Handle,buffer,nNumberOfBytesToRead,read,NULL);
        if(read[0]==nNumberOfBytesToRead)
          {
           result=StringFormat("0x%02x%02x%02x%02x%02x%02x%02x%02x",buffer[7],buffer[6],buffer[5],buffer[4],buffer[3],buffer[2],buffer[1],buffer[0]);
  
           m_price.buffer[0] = buffer[32];
           m_price.buffer[1] = buffer[33];
           m_price.buffer[2] = buffer[34];
           m_price.buffer[3] = buffer[35];
           m_price.buffer[4] = buffer[36];
           m_price.buffer[5] = buffer[37];
           m_price.buffer[6] = buffer[38];
           m_price.buffer[7] = buffer[39];
           mm=m_price.close;
           data[j][0] = StringToDouble(result);
           data[j][1] = mm;
           j=j+1;
           strFileContents=TimeToString(StringToTime(result),3)+" "+DoubleToString(mm,8);
          }
        else
          {
           CloseHandle(Handle);
           return;
          }
       }
     CloseHandle(Handle);
     strFileContents=DoubleToString(data[j-1][0],3)+" "+DoubleToString(data[j-1][1],8)+" "+DoubleToString(data[j-2][1],3)+" "+DoubleToString(data[j-2][1],8);
     result=strFileContents;
    }
  //ReadFileHst <<==--------   --------
  int fnGetLotDigit()
    {
     double l_LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);
     if(l_LotStep == 1)
        return(0);
     if(l_LotStep == 0.1)
        return(1);
     if(l_LotStep == 0.01)
        return(2);
     if(l_LotStep == 0.001)
        return(3);
     if(l_LotStep == 0.0001)
        return(4);
     return(1);
    }
  //+------------------------------------------------------------------+
  int CheckBuyOrders(int magic)
    {
     int op=0;
  
     for(int i=OrdersTotal()-1; i>=0; i--)
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_BUY)
             {
              op++;
              break;
             }
          }
       }
     return(op);
    }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  int CheckSellOrders(int magic)
    {
     int op=0;
  
     for(int i=OrdersTotal()-1; i>=0; i--)
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_SELL)
             {
              op++;
              break;
             }
          }
       }
     return(op);
    }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  int CheckTotalBuyOrders(int magic)
    {
     int op=0;
  
     for(int i=OrdersTotal()-1; i>=0; i--)
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_BUY)
             {
              op++;
             }
          }
       }
     return(op);
    }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  int CheckTotalSellOrders(int magic)
    {
     int op=0;
  
     for(int i=OrdersTotal()-1; i>=0; i--)
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=magic)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_SELL)
             {
              op++;
             }
          }
       }
     return(op);
    }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  int CheckMarketSellOrders()
    {
     int op=0;
  
     for(int i=OrdersTotal()-1; i>=0; i--)
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=MagicID)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_SELL)
             {
              op++;
             }
          }
       }
     return(op);
    }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  int CheckMarketBuyOrders()
    {
     int op=0;
  
     for(int i=OrdersTotal()-1; i>=0; i--)
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
       {
        int status=OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
        if(OrderMagicNumber()!=MagicID)
           continue;
        if(OrderSymbol()==Symbol())
          {
           if(OrderType()==OP_BUY)
             {
              op++;
             }
          }
       }
     return(op);
    }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool MainOrders(int a_cmd_0,double price_24,double price_TP,double price_SL)
    {
     color color_8=Black;
     int bClosed;
     int nAttemptsLeft=Retries;
     int cmd=0;
  
     if(a_cmd_0 ==OP_BUY||a_cmd_0 ==OP_BUYSTOP)
        cmd=0;
     if(a_cmd_0 ==OP_SELL||a_cmd_0 ==OP_SELLSTOP)
        cmd=1;
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
     if(a_cmd_0==OP_BUYLIMIT || a_cmd_0==OP_BUY)
       {
        color_8=Blue;
       }
     else
       {
        //+------------------------------------------------------------------+
        //|                                                                  |
        //+------------------------------------------------------------------+
        if(a_cmd_0==OP_SELLLIMIT || a_cmd_0==OP_SELL)
          {
           color_8=Red;
          }
       }
  
     double lots_32=NormalizeDouble(LOTS,fnGetLotDigit());
  
     if(lots_32==0.0)
        return(false);
  
     double gd_532 = MarketInfo(Symbol(), MODE_MAXLOT);
     double gd_540 = MarketInfo(Symbol(), MODE_MINLOT);
  
     if(lots_32 > gd_532)
        lots_32 = gd_532;
     if(lots_32 < gd_540)
        lots_32 = gd_540;
  
     bClosed=false;
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
     while((bClosed==false) && (nAttemptsLeft>=0))
       {
        nAttemptsLeft--;
        RefreshRates();
  
        if(!ecnBroker)
           bClosed=OrderSend(Symbol(),a_cmd_0,lots_32,price_24,Slippage,price_SL,price_TP,Ordercomment,MagicID,0,color_8);
        else
           bClosed=OrderSend(Symbol(),a_cmd_0,lots_32,price_24,Slippage,0,0,Ordercomment,MagicID,0,color_8);
  
        if(bClosed<=0)
          {
           int nErrResult=GetLastError();
  
           if(a_cmd_0==0)
             {
              Print("FX EA Open New Buy FAILED : Error "+IntegerToString(nErrResult)+" ["+ErrorDescription(nErrResult)+".]");
              Print(IntegerToString(a_cmd_0)+" "+DoubleToString(lots_32,2)+" "+DoubleToString(price_24,Digits));
             }
           else
             {
              if(a_cmd_0==1)
                {
                 Print("FX EA Open New Sell FAILED : Error "+IntegerToString(nErrResult)+" ["+ErrorDescription(nErrResult)+".]");
                 Print(IntegerToString(a_cmd_0)+" "+DoubleToString(lots_32,2)+" "+DoubleToString(price_24,Digits));
                }
             }
  
           if(nErrResult == ERR_TRADE_CONTEXT_BUSY ||
              nErrResult == ERR_NO_CONNECTION)
             {
              Sleep(50);
              continue;
             }
          }
  
        ticket=bClosed;
  
        bClosed=true;
  
       }
  
     return(true);
    }
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  void CloseBuy()
    {
     bool clo;
     while(CheckMarketBuyOrders()>0)
       {
        for(int i=OrdersTotal()-1; i>=0; i--)
          {
           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
              if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicID)
                 if(OrderType()==OP_BUY)
                    clo=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,clrAqua);
  
          }
       }
  
    }
  //+------------------------------------------------------------------+
  void CloseSell()
    {
     bool clo;
     while(CheckMarketSellOrders()>0)
       {
        for(int i=OrdersTotal()-1; i>=0; i--)
          {
           if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
              if(OrderSymbol()==Symbol() && OrderMagicNumber()==MagicID)
                 if(OrderType()==OP_SELL)
                    clo=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage,clrAqua);
  
          }
       }
    }
  //+------------------------------------------------------------------+
  double GetLots()
    {
     double lot;
     double minlot=MarketInfo(Symbol(),MODE_MINLOT);
     double maxlot=MarketInfo(Symbol(),MODE_MAXLOT);
     if(risk!=0)
       {
        lot=NormalizeDouble(AccountBalance()*risk/100/10000,2);
        if(lot<minlot)
           lot=minlot;
        if(lot>maxlot)
           lot=maxlot;
       }
     else
        lot=LOTS;
     return(lot);
    }
  //+------------------------------------------------------------------+
  int signal(int mode)
    {
     int res=0;
  
     double var1 = 0;
     double var2 = 0;
     double var3 = 0;
     double var4 = 0;
     double var5 = 0;
     double var6 = 0;
  
  
     if(Close[2]>Open[2] && Close[1]>Open[1] && Low[2]<Low[1])
       {
        if(mode==2)
          {
           var5 = Low[2];
           var6 = Low[1];
           if(Open[0]<var6 -(var5-var6))
             {
              var1=High[0];
             }
           if(Open[2]<Open[1])
             {
              var5 = Open[2];
              var6 = Open[1];
             }
           else
             {
              var5 = 0.0;
              var6 = 0.0;
             }
           if(Open[0]<var6 -(var5-var6))
             {
              var3=High[0];
             }
          }
        else
          {
           if(mode==0)
             {
              if(Open[2]<Open[1])
                {
                 var5 = Open[2];
                 var6 = Open[1];
                }
              else
                {
                 var5 = 0.0;
                 var6 = 0.0;
                }
             }
           else
             {
              var5 = Low[2];
              var6 = Low[1];
             }
           if(Open[0]<var6 -(var5-var6))
             {
              var3=High[0];
             }
          }
       }
     if(Open[2]>Close[2] && Open[1]>Close[1] && High[2]>High[1])
       {
        if(mode==2)
          {
           var5 = High[2];
           var6 = High[1];
           if(Open[0]>var6 -(var5-var6))
             {
              var2=Low[0];
             }
           if(Open[2]>Open[1])
             {
              var5 = Open[2];
              var6 = Open[1];
             }
           else
             {
              var5 = 0.0;
              var6 = 0.0;
             }
           if(Open[0]>var6 -(var5-var6))
             {
              var4=Low[0];
             }
          }
        else
          {
           if(mode==0)
             {
              if(Open[2]>Open[1])
                {
                 var5 = Open[2];
                 var6 = Open[1];
                }
              else
                {
                 var5 = 0.0;
                 var6 = 0.0;
                }
             }
           else
             {
              var5 = High[2];
              var6 = High[1];
             }
           if(Open[0]>var6 -(var5-var6))
             {
              var4=Low[0];
             }
          }
       }
     if((var1>0.0 || var3>0.0))
       {
        res=+1;
       }
     else
       {
        if((var2>0.0 || var4>0.0))
          {
           res=-1;
          }
       }
  
     return res;
  
    }
  //+------------------------------------------------------------------+
  string CandleStick_Analyzer()
    {
     RefreshRates();
     string CandleStick, Comment1="",Comment2="",Comment3="",Comment4="",Comment5="",Comment6="",Comment7="",Comment8="",Comment9="";
  
     if(BullishEngulfingExists())
        Comment1 =" Bullish Engulfing ";
     if(BullishHaramiExists())
        Comment2 =" Bullish Harami ";
     if(LongUpCandleExists())
        Comment3 =" Bullish LongUp ";
     if(DojiAtBottomExists())
        Comment4 =" MorningStar Doji ";
  
     if(DojiAtTopExists())
        Comment5 =" EveningStar Doji ";
     if(BearishHaramiExists())
        Comment6 =" Bearish Harami ";
     if(BearishEngulfingExists())
        Comment7 =" Bearish Engulfing ";
     if(LongDownCandleExists())
        Comment8 =" Bearish LongDown ";
  
     /*if(SpinningTopExists())
        Comment9 =" Spinning Top ";*/
  
     CandleStick =Comment1+Comment2+Comment3+Comment4+Comment5+Comment6+Comment7+Comment8+Comment9;
     return (CandleStick);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool BullishEngulfingExists()
    {
     if(Open[1] <= Close[2] && Close[1] >= Open[2] && Open[2] -  Close[2] >= 10*Point && Close[1] - Open[1] >= 10*Point)
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool BullishHaramiExists()
    {
     if(Close[2] < Open[2] && Open[1] < Close[1] && Open[2] - Close[2] > iATR(NULL, 0, 14, 2) && Open[2] - Close[2] > 4*(Close[1] - Open[1]))
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool DojiAtBottomExists()
    {
     if(Open[3] - Close[3] >= 8*Point && MathAbs(Close[2] - Open[2]) <= 1*Point && Close[1] - Open[1] >= 8*Point)
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool DojiAtTopExists()
    {
     if(Close[3] - Open[3] >= 8*Point && MathAbs(Close[2] - Open[2]) <= 1*Point && Open[1] - Close[1] >= 8*Point)
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool BearishHaramiExists()
    {
     if(Close[2] > Close[1] && Open[2] < Open[1] && Close[2] > Open[2] && Open[1] > Close[1] && Close[2] -  Open[2] > iATR(NULL, 0, 14, 2) && Close[2] -  Open[2] > 4*(Open[1] -  Close[1]))
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool LongUpCandleExists()
    {
     if(Open[2] < Close[2] && High[2] - Low[2] >= 40*Point && High[2] - Low[2] > 2.5*iATR(NULL, 0, 14, 2) && Close[1] < Open[1] && Open[1] -  Close[1] > 10*Point)
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool LongDownCandleExists()
    {
     if(Open[1] > Close[1] && High[1] -Low[1] >= 40*Point && High[1] - Low[1] > 2.5*iATR(NULL, 0, 14, 1))
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool BearishEngulfingExists()
    {
     if(Open[1] >= Close[2] && Close[1] <= Open[2] && Open[2] -Close[2] >= 10*Point && Close[1]- Open[1] >= 10*Point)
        return (true);
     return (false);
    }
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  /*bool SpinningTopExists()
    {
     HideTestIndicators(true);
     if(High[1] - Low[1] > 1.5*iATR(NULL, 0, 14, 1))
        Print("ST Condition 1 Met");
     if(MathAbs(Open[1] - Close[1])*5 < High[1] - Low[1])
        Print("ST Condition 2 Met");
     if(High[1] - Low[1] > 1.5*iATR(NULL, 0, 14, 1) && (High[1] - Low[1] > 30*Point) && MathAbs(Open[1] - Close[1])*5 < High[1]- Low[1])
        return (true);
     HideTestIndicators(false);
     return (false);
    }*/
  //+------------------------------------------------------------------+
  void MakeLine(double price)
    {
     string name="level";
  
     if(price>iOpen(Symbol(),PERIOD_M1,0))
        Comment("BUY = "+DoubleToStr(price,Digits));
     if(price<iOpen(Symbol(),PERIOD_M1,0))
        Comment("SELL= "+DoubleToStr(price,Digits));
  
     if(ObjectFind(name)!=-1)
       {
        ObjectMove(name,0,iTime(Symbol(),PERIOD_M1,0),price);
        return;
       }
     ObjectCreate(name,OBJ_HLINE,0,0,price);
     ObjectSet(name,OBJPROP_COLOR,clrAqua);
     ObjectSet(name,OBJPROP_STYLE,STYLE_SOLID);
     ObjectSet(name,OBJPROP_WIDTH,2);
     ObjectSet(name,OBJPROP_BACK,TRUE);
    }
  //+------------------------------------------------------------------+
  //+------------------------------------------------------------------+
  //| User function IsPinbar                                           |
  //+------------------------------------------------------------------+
  bool IsBuyPinbar()
    {
  //start of declarations
     double actOp,actCl,actHi,actLo,preHi,preLo,preCl,preOp,actRange,preRange,actHigherPart,actHigherPart1;
     actOp=Open[1];
     actCl=Close[1];
     actHi=High[0];
     actLo=Low[1];
     preOp=Open[2];
     preCl=Close[2];
     preHi=High[2];
     preLo=Low[2];
  //SetProxy(preHi,preLo,preOp,preCl);//Check proxy
     actRange=actHi-actLo;
     preRange=preHi-preLo;
     actHigherPart=actHi-actRange*0.4;//helping variable to not have too much counting in IF part
     actHigherPart1=actHi-actRange*0.4;//helping variable to not have too much counting in IF part
  //end of declaratins
  //start function body
     double dayRange=AveRange4();
     if((actCl>actHigherPart1&&actOp>actHigherPart)&&  //Close&Open of PB is in higher 1/3 of PB
        (actRange>dayRange*0.5)&& //PB is not too small
  //(actHi<(preHi-preRange*0.3))&& //High of PB is NOT higher than 1/2 of previous Bar
        (actLo+actRange*0.25<preLo)) //Nose of the PB is at least 1/3 lower than previous bar
       {
  
        if(Low[ArrayMinimum(Low,3,3)]>Low[1])
           return (true);
       }
     return(false);
  
    }//------------END FUNCTION-------------
  
  
  //+------------------------------------------------------------------+
  //|                                                                  |
  //+------------------------------------------------------------------+
  bool IsSellPinbar()
    {
  //start of declarations
     double actOp,actCl,actHi,actLo,preHi,preLo,preCl,preOp,actRange,preRange,actLowerPart, actLowerPart1;
     actOp=Open[1];
     actCl=Close[1];
     actHi=High[1];
     actLo=Low[1];
     preOp=Open[2];
     preCl=Close[2];
     preHi=High[2];
     preLo=Low[2];
  //SetProxy(preHi,preLo,preOp,preCl);//Check proxy
     actRange=actHi-actLo;
     preRange=preHi-preLo;
     actLowerPart=actLo+actRange*0.4;//helping variable to not have too much counting in IF part
     actLowerPart1=actLo+actRange*0.4;//helping variable to not have too much counting in IF part
  //end of declaratins
  
  //start function body
  
     double dayRange=AveRange4();
     if((actCl<actLowerPart1&&actOp<actLowerPart)&&  //Close&Open of PB is in higher 1/3 of PB
        (actRange>dayRange*0.5)&& //PB is not too small
  //(actLo>(preLo+preRange/3.0))&& //Low of PB is NOT lower than 1/2 of previous Bar
        (actHi-actRange*0.25>preHi)) //Nose of the PB is at least 1/3 lower than previous bar
  
       {
        if(High[ArrayMaximum(High,3,3)]<High[1])
           return (true);
       }
     return false;
    }//------------END FUNCTION-------------
  //+------------------------------------------------------------------+
  //| User function AveRange4                                          |
  //+------------------------------------------------------------------+
  double AveRange4()
    {
     double sum=0;
     double rangeSerie[4];
  
     int i=0;
     int ind=1;
     int startYear=1995;
  
  
     while(i<4)
       {
        //datetime pok=Time[pos+ind];
        if(TimeDayOfWeek(Time[ind])!=0)
          {
           sum+=High[ind]-Low[ind];//make summation
           i++;
          }
        ind++;
        //i++;
       } 
  //Comment(sum/4.0);
     return (sum/4.0);//make average, don't count min and max, this is why I divide by 4 and not by 6
  
  
    }//------------END FUNCTION-------------
  
  
  
  
  //+------------------------------------------------------------------+
  


スポンサーリンク
検索

↑の検索エンジンが表示されない人は、
↓の古い検索エンジンを使用して下さい。
カスタム検索
MQL4リファレンスツリー
スポンサーリンク
スポンサーリンク


Copyright ©2015 MT4でEA自作しちゃお~ All Rights Reserved.


Top

inserted by FC2 system