MACD Sample ---真正的用面向對象的思路來寫EA [MT4]
作者:
MT4 來源:
cxh99.com 發布時間:2012年05月30日 點擊數:
【
收藏到本網的會員中心】
- 我初步看了下系統自帶的MACD Sample EA,這個實例其實用原來MT4的方式實現起來很簡單。
但是我看了系統自帶的代碼:簡直和C++代碼沒什么區別了:
首先應用頭文件或者說是庫文件。這些文件其實都是類庫文件,每個類里面自帶了許多處理方法
接著定義一個類
然后吧一些變量和方法都封裝到類中。
最后void OnTick()程序實體部分簡單的不可想象:
就是定義一個類的實例,然后調用一個類的方法就完了。
以后有時間我好好分析分析。
//+------------------------------------------------------------------+
//| MACD Sample.mq5 |
//| Copyright 2001-2009, MetaQuotes Software Corp. |
//| http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2001-2009, MetaQuotes Software Corp."
#property link "http://www.mql5.com"
#property version "5.04"
#property description "It is important to make sure that the expert works with a normal"
#property description "chart and the user did not make any mistakes setting input"
#property description "variables (Lots, TakeProfit, TrailingStop) in our case,"
#property description "we check TakeProfit on a chart of more than 2*trend_period bars"
//---
#include <Trade\Trade.mqh> 引用頭文件
#include <Trade\SymbolInfo.mqh>
#include <Trade\PositionInfo.mqh>
#include <Trade\AccountInfo.mqh>
#include <Indicators\Indicators.mqh>
//---
input double InpLots =0.1; // Lots
input int InpTakeProfit =50; // Take Profit (in pips)
input int InpTrailingStop =30; // Trailing Stop Level (in pips)
input double InpMACDOpenLevel =0.3; // MACD open level
input double InpMACDCloseLevel=0.2; // MACD close level
input int InpMATrendPeriod =26; // MA trend period
//---
int ExtTimeOut=10; // time out in seconds between trade operations
//+------------------------------------------------------------------+
//| MACD Sample expert class |
//+------------------------------------------------------------------+
class CSampleExpert
{
protected:
double m_adjusted_point; // point value adjusted for 3 or 5 points
CTrade m_trade; // trading object
CSymbolInfo m_symbol; // symbol info object
CPositionInfo m_position; // trade position object
CAccountInfo m_account; // account info wrapper
//--- indicators
CIndicators *m_indicators; // indicator collection to fast recalculations
CiMACD *m_MACD; // MACD indicator object
CiMA *m_EMA; // moving average indicator object
//--- indicator data for processing
double m_macd_current;
double m_macd_previous;
double m_signal_current;
double m_signal_previous;
double m_ema_current;
double m_ema_previous;
public:
CSampleExpert();
~CSampleExpert() { Deinit(); }
bool Init();
void Deinit();
bool Processing();
protected:
bool InitCheckParameters(int digits_adjust);
bool InitIndicators();
bool LongClosed();
bool ShortClosed();
bool LongModified();
bool ShortModified();
bool LongOpened();
bool ShortOpened();
};
//---
CSampleExpert ExtExpert;
//+------------------------------------------------------------------+
//| Constructor |
//+------------------------------------------------------------------+
CSampleExpert::CSampleExpert()
{
//---
m_adjusted_point=0;
m_indicators=NULL;
m_MACD=NULL;
m_EMA =NULL;
//---
m_macd_current =0;
m_macd_previous =0;
m_signal_current =0;
m_signal_previous=0;
m_ema_current =0;
m_ema_previous =0;
//---
}
//+------------------------------------------------------------------+
//| Initialization and checking for input parameters |
//+------------------------------------------------------------------+
bool CSampleExpert::Init()
{
//--- initialize common information
m_symbol.Name(Symbol()); // symbol
m_trade.SetExpertMagicNumber(12345); // magic
//--- tuning for 3 or 5 digits
int digits_adjust=1;
if(m_symbol.Digits()==3 || m_symbol.Digits()==5) digits_adjust=10;
m_adjusted_point=m_symbol.Point()*digits_adjust;
//--- set default deviation for trading in adjusted points
m_trade.SetDeviationInPoints(3*digits_adjust);
//---
if(!InitCheckParameters(digits_adjust)) return(false);
if(!InitIndicators()) return(false);
//--- ok
return(true);
}
//+------------------------------------------------------------------+
//| Checking for input parameters |
//+------------------------------------------------------------------+
bool CSampleExpert::InitCheckParameters(int digits_adjust)
{
//--- initial data checks
if(InpTakeProfit*digits_adjust<m_symbol.StopsLevel())
{
printf("Take Profit must be greater than %d",m_symbol.StopsLevel());
return(false);
}
if(InpTrailingStop*digits_adjust<m_symbol.StopsLevel())
{
printf("Trailing Stop must be greater than %d",m_symbol.StopsLevel());
return(false);
}
//--- check for right lots amount
if(InpLots<m_symbol.LotsMin() || InpLots>m_symbol.LotsMax())
{
printf("Lots amount must be in the range from %f to %f",m_symbol.LotsMin(),m_symbol.LotsMax());
return(false);
}
if(MathAbs(MathMod(InpLots,m_symbol.LotsStep()))>1.0E-15)
{
printf("Lots amount is not corresponding with lot step %f",m_symbol.LotsStep());
return(false);
}
//--- warning
if(InpTakeProfit<=InpTrailingStop)
printf("Warning: Trailing Stop must be greater than Take Profit");
//--- ok
return(true);
}
//+------------------------------------------------------------------+
//| Initialization of the indicators |
//+------------------------------------------------------------------+
bool CSampleExpert::InitIndicators()
{
//--- create indicators collection
if(m_indicators==NULL)
if((m_indicators=new CIndicators)==NULL)
{
printf("Error creating indicators collection");
return(false);
}
//--- create MACD indicator and add it to collection
if(m_MACD==NULL)
if((m_MACD=new CiMACD)==NULL)
{
printf("Error creating MACD indicator");
return(false);
}
if(!m_indicators.Add(m_MACD))
{
printf("Error adding MACD indicator to collection");
return(false);
}
//--- initialize MACD indicator
if(!m_MACD.Create(NULL,0,12,26,9,PRICE_CLOSE))
{
printf("Error MACD indicator init");
return(false);
}
m_MACD.BuffSize(2);
//--- create EMA indicator and add it to collection
if(m_EMA==NULL)
if((m_EMA=new CiMA)==NULL)
{
printf("Error creating EMA indicator");
return(false);
}
if(!m_indicators.Add(m_EMA))
{
printf("Error adding EMA indicator to collection");
return(false);
}
//--- initialize EMA indicator
if(!m_EMA.Create(NULL,0,InpMATrendPeriod,0,MODE_EMA,PRICE_CLOSE))
{
printf("Error EMA indicator init");
return(false);
}
m_EMA.BuffSize(2);
//--- ok
return(true);
}
//+------------------------------------------------------------------+
//| Function for deleting of dynamic objects |
//+------------------------------------------------------------------+
void CSampleExpert::Deinit()
{
//--- delete indicators collection
if(m_indicators!=NULL)
{
delete m_indicators;
m_indicators=NULL;
m_MACD=NULL;
m_EMA =NULL;
}
//---
}
//+------------------------------------------------------------------+
//| Check for long position closing |
//+------------------------------------------------------------------+
bool CSampleExpert::LongClosed()
{
bool res=false;
//--- should it be closed?
if(m_macd_current>0)
if(m_macd_current<m_signal_current && m_macd_previous>m_signal_previous)
if(m_macd_current>InpMACDCloseLevel*m_adjusted_point)
{
//--- close position
if(m_trade.PositionClose(Symbol()))
printf("Long position by %s to be closed",Symbol());
else
printf("Error closing position by %s : '%s'",Symbol(),m_trade.ResultComment());
//--- processed and cannot be modified
res=true;
}
//---
return(res);
}
//+------------------------------------------------------------------+
//| Check for short position closing |
//+------------------------------------------------------------------+
bool CSampleExpert::ShortClosed()
{
bool res=false;
//--- should it be closed?
if(m_macd_current<0)
if(m_macd_current>m_signal_current && m_macd_previous<m_signal_previous)
if(MathAbs(m_macd_current)>InpMACDCloseLevel*m_adjusted_point)
{
//--- close position
if(m_trade.PositionClose(Symbol()))
printf("Short position by %s to be closed",Symbol());
else
printf("Error closing position by %s : '%s'",Symbol(),m_trade.ResultComment());
//--- processed and cannot be modified
res=true;
}
//---
return(res);
}
//+------------------------------------------------------------------+
//| Check for long position modifying |
//+------------------------------------------------------------------+
bool CSampleExpert::LongModified()
{
bool res=false;
//--- check for trailing stop
if(InpTrailingStop>0)
{
if(m_symbol.Bid()-m_position.PriceOpen()>m_adjusted_point*InpTrailingStop)
{
if(m_position.StopLoss()<m_symbol.Bid()-m_adjusted_point*InpTrailingStop || m_position.StopLoss()==0.0)
{
double sl=m_symbol.Bid()-m_adjusted_point*InpTrailingStop;
double tp=m_position.TakeProfit();
//--- modify position
if(m_trade.PositionModify(Symbol(),sl,tp))
printf("Long position by %s to be modified",Symbol());
else
{
printf("Error modifying position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Modify parameters : SL=%f,TP=%f",sl,tp);
}
//--- modified and must exit from expert
res=true;
}
}
}
//---
return(res);
}
//+------------------------------------------------------------------+
//| Check for short position modifying |
//+------------------------------------------------------------------+
bool CSampleExpert::ShortModified()
{
bool res=false;
//--- check for trailing stop
if(InpTrailingStop>0)
{
if((m_position.PriceOpen()-m_symbol.Ask())>(m_adjusted_point*InpTrailingStop))
{
if((m_position.StopLoss()>(m_symbol.Ask()+m_adjusted_point*InpTrailingStop)) || m_position.StopLoss()==0.0)
{
double sl=m_symbol.Ask()+m_adjusted_point*InpTrailingStop;
double tp=m_position.TakeProfit();
//--- modify position
if(m_trade.PositionModify(Symbol(),sl,tp))
printf("Short position by %s to be modified",Symbol());
else
{
printf("Error modifying position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Modify parameters : SL=%f,TP=%f",sl,tp);
}
//--- modified and must exit from expert
res=true;
}
}
}
//---
return(res);
}
//+------------------------------------------------------------------+
//| Check for long position opening |
//+------------------------------------------------------------------+
bool CSampleExpert::LongOpened()
{
bool res=false;
//--- check for long position (BUY) possibility
if(m_macd_current<0)
if(m_macd_current>m_signal_current && m_macd_previous<m_signal_previous)
if(MathAbs(m_macd_current)>(InpMACDOpenLevel*m_adjusted_point) && m_ema_current>m_ema_previous)
{
//--- check for free money
if(m_account.FreeMarginCheck(Symbol(),0,InpLots)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
else
{
double price=m_symbol.Ask();
double tp =m_symbol.Ask()+InpTakeProfit*m_adjusted_point;
//--- open position
if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
printf("Position by %s to be opened",Symbol());
else
{
printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
}
//--- in any case we must exit from expert
res=true;
}
//---
return(res);
}
//+------------------------------------------------------------------+
//| Check for short position opening |
//+------------------------------------------------------------------+
bool CSampleExpert::ShortOpened()
{
bool res=false;
//--- check for short position (SELL) possibility
if(m_macd_current>0)
if(m_macd_current<m_signal_current && m_macd_previous>m_signal_previous)
if(m_macd_current>(InpMACDOpenLevel*m_adjusted_point) && m_ema_current<m_ema_previous)
{
//--- check for free money
if(m_account.FreeMarginCheck(Symbol(),0,InpLots)<0.0)
printf("We have no money. Free Margin = %f",m_account.FreeMargin());
else
{
double price=m_symbol.Bid();
double tp =m_symbol.Bid()-InpTakeProfit*m_adjusted_point;
//--- open position
if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,InpLots,price,0.0,tp))
printf("Position by %s to be opened",Symbol());
else
{
printf("Error opening SELL position by %s : '%s'",Symbol(),m_trade.ResultComment());
printf("Open parameters : price=%f,TP=%f",price,tp);
}
}
//--- in any case we must exit from expert
res=true;
}
//---
return(res);
}
//+------------------------------------------------------------------+
//| main function returns true if any position processed |
//+------------------------------------------------------------------+
bool CSampleExpert::Processing()
{
//--- refresh rates
if(!m_symbol.RefreshRates()) return(false);
//--- refresh indicators
m_indicators.Refresh();
//--- to simplify the coding and speed up access
//--- data are put into internal variables
m_macd_current =m_MACD.Main(0);
m_macd_previous =m_MACD.Main(1);
m_signal_current =m_MACD.Signal(0);
m_signal_previous=m_MACD.Signal(1);
m_ema_current =m_EMA.Main(0);
m_ema_previous =m_EMA.Main(1);
//--- it is important to enter the market correctly,
//--- but it is more important to exit it correctly...
//--- first check if position exists - try to select it
if(m_position.Select(Symbol()))
{
if(m_position.PositionType()==OP_BUY)
{
//--- try to close or modify long position
if(LongClosed()) return(true);
if(LongModified()) return(true);
}
else
{
//--- try to close or modify short position
if(ShortClosed()) return(true);
if(ShortModified()) return(true);
}
}
//--- no opened position identified
else
{
//--- check for long position (BUY) possibility
if(LongOpened()) return(true);
//--- check for short position (SELL) possibility
if(ShortOpened()) return(true);
}
//--- exit without position processing
return(false);
}
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create all necessary objects
if(!ExtExpert.Init())
{
ExtExpert.Deinit();
return(-1);
}
//--- ok
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ExtExpert.Deinit();
}
//+------------------------------------------------------------------+
//| Expert new tick handling function |
//+------------------------------------------------------------------+
void OnTick()
{
static datetime limit_time=0; // last trade processing time + timeout
//--- don't process if timeout
if(TimeCurrent()>=limit_time)
{
//--- check for data
if(Bars(Symbol(),Period())>2*InpMATrendPeriod)
{
//--- change limit time by timeout in seconds if processed
if(ExtExpert.Processing()) limit_time=TimeCurrent()+ExtTimeOut;
}
}
//---
}
//+------------------------------------------------------------------+
中文字幕av无码不卡免费_蜜臀AV无码精品人妻色欲_亚洲成AV人片在线观看无码不卡_无码专区天天躁天天躁在线
欧美视频四区|
日韩视频中文|
久久夜色精品|
久久久精品动漫|
噜噜噜在线观看免费视频日韩|
亚洲免费观看|
男女精品视频|
欧美日韩系列|
亚洲一区欧美激情|
欧美在线三区|
aa日韩免费精品视频一|
极品av少妇一区二区|
欧美一区久久|
香蕉久久a毛片|
欧美精品偷拍|
女同性一区二区三区人了人一
|
免费亚洲一区二区|
久久久精品性|
99热精品在线|
欧美日韩影院|
久久精品九九|
午夜一区二区三视频在线观看|
国产精品v亚洲精品v日韩精品|
黄色成人91|
亚洲一区二区三区涩|
国产自产在线视频一区|
欧美亚洲免费高清在线观看|
伊人久久综合|
国精品一区二区|
国产伦精品一区二区三区高清版
|
激情久久综合|
欧美福利一区二区三区|
国产精品一区二区欧美|
亚洲国产影院|
欧美午夜不卡|
欧美专区一区二区三区|
夜久久久久久|
国产手机视频一区二区|
亚洲小说欧美另类社区|
鲁鲁狠狠狠7777一区二区|
亚洲高清av|
久久精品一区二区三区中文字幕
|
欧美一区国产一区|
国产欧美精品|
日韩亚洲精品在线|
伊人久久大香线蕉av超碰演员|
欧美日本国产精品|
欧美日韩四区|
国内揄拍国内精品久久|
好吊视频一区二区三区四区|
欧美日本不卡|
欧美日本国产|
国精品一区二区|
国产主播精品|
91久久精品国产91久久性色tv|
亚洲国产高清一区|
亚洲少妇诱惑|
免费视频一区二区三区在线观看|
性一交一乱一区二区洋洋av|
久久国产精品一区二区三区四区|
免费在线国产精品|
久久只有精品|
激情欧美一区二区三区|
日韩一级网站|
久久福利精品|
欧美天天在线|
亚洲国产专区校园欧美|
亚洲一区三区在线观看|
欧美一区1区三区3区公司
|
在线精品一区二区|
亚洲激情在线|
久久久久一区二区三区|
亚洲女优在线|
欧美96在线丨欧|
国产精品v欧美精品v日韩|
狠狠综合久久|
国产一区二区高清不卡|
久久婷婷影院|
亚洲日韩视频|
欧美二区视频|
日韩一级免费|
亚洲欧美一区二区原创|
99国产精品99久久久久久粉嫩|
国产精品人人爽人人做我的可爱|
欧美成人蜜桃|
国产视频久久|
亚洲图片在线|
午夜精品免费|
蘑菇福利视频一区播放|
一区二区视频欧美|
久久精品123|
91久久视频|
欧美午夜免费|
久久一二三区|
亚洲专区一区二区三区|
伊人成人在线视频|
欧美日韩成人一区二区三区|
亚洲一区日韩|
日韩视频不卡|
在线观看欧美亚洲|
欧美视频网站|
午夜精品亚洲一区二区三区嫩草|
亚洲欧美电影在线观看|
一区二区三区成人精品|
亚洲国产日韩在线|
樱桃成人精品视频在线播放|
国产精品大片|
欧美精品二区三区四区免费看视频|
国产亚洲亚洲|
国产九九精品|
午夜一区不卡|
性久久久久久|
久久精品国产清高在天天线|
国产一区二区三区成人欧美日韩在线观看|
好看的日韩av电影|
欧美日韩免费观看一区=区三区
|
在线一区亚洲|
在线观看欧美一区|
亚洲精品123区|
亚洲区一区二|
一区二区三区欧美在线|
国产日韩欧美一区|
国产伦精品一区二区三|
午夜在线精品偷拍|
久久久久久网|
国产精品xvideos88|
韩国在线视频一区|
亚洲一级黄色|
一本色道久久综合亚洲二区三区|
一区二区高清视频|
久久国产66|
国产精品xxx在线观看www|
黄色一区三区|
在线午夜精品|
久久久久久一区二区|
欧美精品99|
亚洲精品日韩在线观看|
亚洲影院免费|
欧美三级不卡|
日韩亚洲视频|
久久精品国产清高在天天线|
欧美深夜福利|
亚洲视频大全|
欧美日韩一区二区三区四区在线观看|
亚洲丰满在线|
久久一区二区三区av|
合欧美一区二区三区|
99精品国产在热久久|
久久久精品网|
亚洲看片一区|
欧美欧美天天天天操|
99热免费精品|
欧美色综合网|
久久国产日本精品|
亚洲青色在线|
欧美午夜精品|
久久九九99|
国产欧美不卡|
在线不卡欧美|
亚洲欧美一级二级三级|
国产精品推荐精品|
狠狠噜噜久久|
欧美喷水视频|
久久综合亚州|
亚洲欧美不卡|
国产一区成人|
亚洲狼人精品一区二区三区|
欧美日韩在线一二三|
久久国产主播|
国产精品美女久久久|
亚洲成人自拍视频|
欧美日韩精品免费看|
久久精品99|
国产精品日本欧美一区二区三区|
国内一区二区在线视频观看|
欧美一区亚洲二区|
午夜亚洲视频|
午夜在线视频一区二区区别
|
欧美亚洲专区|
99精品国产在热久久|
狠狠88综合久久久久综合网|
欧美黄在线观看|
毛片一区二区|
久久久久se|
噜噜噜躁狠狠躁狠狠精品视频|
9国产精品视频|
在线亚洲观看|
国产精品日韩久久久|
国产手机视频一区二区|
亚洲美女色禁图|
99热精品在线观看|
一区二区三区福利|
国产精品呻吟|
久久电影一区|
欧美一区激情视频在线观看|
欧美xxx在线观看|
欧美破处大片在线视频|
国产精品magnet|
狠狠入ady亚洲精品经典电影|
国内一区二区三区在线视频|
激情欧美国产欧美|
亚洲免费观看|
午夜亚洲视频|
欧美+亚洲+精品+三区|
欧美三区在线|
亚洲精品看片|
亚洲欧美国产不卡|
欧美成ee人免费视频|
欧美日韩精品久久|
亚洲国产高清一区|
亚洲一区二区在线免费观看|
久久免费一区|
欧美日韩综合网|
亚洲人成久久|
久久黄色网页|
激情久久一区|
亚洲欧美日韩一区在线观看|
欧美成人综合|
日韩一区二区久久|
可以免费看不卡的av网站|
国产精品s色|
国产女主播一区二区三区|
欧美福利一区二区三区|
日韩一级在线|
欧美激情无毛|
国产视频在线观看一区|
欧美激情日韩|
国产精品日本|
亚洲小说欧美另类婷婷|
销魂美女一区二区三区视频在线|
国产精品v一区二区三区|
99精品国产99久久久久久福利|
久久精品亚洲一区二区|
亚洲激情成人|
欧美va天堂在线|
国产日韩综合|
亚洲私人影院|
欧美一区成人|
国产精品亚洲不卡a|
欧美精品九九|
久久激情综合|
国产欧美日韩亚洲|
亚洲一级高清|
欧美日韩大片一区二区三区
|
激情成人综合|
欧美一区二区三区久久精品茉莉花
|
久久久精品国产一区二区三区|
亚洲午夜精品一区二区|
久久激情网站|
国产伦一区二区三区色一情|
亚洲高清在线观看一区|
欧美另类专区|
欧美在线日韩|
久久久久国产一区二区|
国产精品亚洲综合|
亚洲免费成人|
亚洲精品四区|
亚洲精品偷拍|
日韩天天综合|
亚洲伦理精品|
亚洲精品韩国|
亚洲欧洲视频|
亚洲精品一区二区三区av|
精品不卡视频|
亚洲国产日韩欧美|
在线免费高清一区二区三区|
欧美三日本三级少妇三99|
欧美+亚洲+精品+三区|
噜噜噜在线观看免费视频日韩|
国产亚洲一级|
久久99伊人|
久久亚洲精品欧美|
欧美福利专区|
欧美日韩在线一二三|
国产精品a久久久久|
红桃视频国产一区|
亚洲国内自拍|
国产亚洲毛片|
亚洲欧美视频|
牛夜精品久久久久久久99黑人|
欧美 日韩 国产 一区|
欧美精品免费观看二区|
国色天香一区二区|
亚洲经典自拍|
国产伦理一区|
久久亚洲国产精品日日av夜夜|
欧美aⅴ99久久黑人专区|
欧美特黄一级|
亚洲精品人人|
久久久久久夜|
樱桃成人精品视频在线播放|
国产欧美精品|
美女精品网站|
国内精品久久久久久久果冻传媒
|
亚洲一区国产|
欧美在线国产|
激情偷拍久久|
国模 一区 二区 三区|
国产欧美91|
久久久久久夜|
日韩亚洲视频在线|
韩国久久久久|
精品91视频|
国产综合色产|
99伊人成综合|
久久国产精品99国产|
亚洲精品欧美|
欧美日韩在线精品|
久久大香伊蕉在人线观看热2|
欧美资源在线|
亚洲午夜精品久久久久久浪潮
|
亚洲区一区二区三区|
99亚洲精品|
欧美日韩一区在线观看视频|
国产日本精品|
国产字幕视频一区二区|
亚洲一区二区在线看|
欧美日韩一区二区国产|
国产精品一区二区a|
欧美视频一区|
毛片一区二区|
国产日韩亚洲|
亚洲国产黄色|
欧美黄色大片网站|
亚洲一区日韩在线|
亚洲国产影院|
国产中文一区|
欧美一区免费|
免费久久99精品国产自在现线|
在线观看一区欧美|
国产精品www.|
欧美日韩mv|
欧美在线播放一区二区|
亚洲免费影视|
国产亚洲精品v|
99视频一区|
夜夜精品视频|
av不卡在线看|
99国产精品99久久久久久粉嫩|
亚洲视频一二|
欧美日韩亚洲一区三区|
欧美一区激情|
欧美成人69|
午夜精品偷拍|
欧美日韩综合另类|
国内在线观看一区二区三区|
欧美午夜免费|
黄色日韩精品|
亚洲视频精品|
亚洲人www|
国产欧美日韩亚洲|
中日韩在线视频|
亚洲免费影视|
久久免费一区|
欧美日韩一区在线观看视频|
国内视频精品|
日韩午夜一区|
午夜在线视频一区二区区别|
亚洲一区二区在线看|
亚洲欧美视频|
午夜国产欧美理论在线播放
|
国产精品美女诱惑|
国产九区一区在线|
久久婷婷人人澡人人喊人人爽|
欧美成人首页|
1024日韩|
男人的天堂亚洲|
欧美日韩一区二区高清|
黄色亚洲在线|
国产亚洲精品久久久久婷婷瑜伽|
亚洲综合国产激情另类一区|
久久中文欧美|
亚洲一级高清|
国产视频一区免费看|
可以看av的网站久久看|
国内精品久久久久久久影视蜜臀|
亚洲黄色天堂|
久久青草久久|
亚洲国内精品|
久久久噜噜噜|
91久久精品www人人做人人爽|
亚洲一区欧美二区|
国产精品国产亚洲精品看不卡15
|
久久精品天堂|
伊人精品在线|
久久久久久久久久码影片|
伊人久久成人|
久久永久免费|
夜夜嗨网站十八久久|
欧美在线视频一区二区三区|
在线日韩av永久免费观看|
久久动漫亚洲|
日韩午夜电影|
韩国久久久久|
久久精品日韩|
亚洲深夜福利|
激情视频一区二区|
欧美在线国产|
亚洲欧美日韩综合国产aⅴ|
永久域名在线精品|