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人片在线观看无码不卡_无码专区天天躁天天躁在线
欧美.日韩.国产.一区.二区|
中国成人在线视频|
黄色av一区|
亚洲性图久久|
日韩午夜免费|
久久激情一区|
欧美午夜在线|
夜夜爽av福利精品导航|
亚洲欧美久久久久一区二区三区|
亚洲男女自偷自拍|
午夜精品亚洲一区二区三区嫩草|
在线观看成人av电影|
久久国产福利|
国产综合激情|
午夜一区二区三视频在线观看|
欧美一区二区三区免费看|
欧美成人dvd在线视频|
激情综合激情|
美女精品在线|
在线精品在线|
欧美久久一区|
羞羞视频在线观看欧美|
久久国产精品久久w女人spa|
国产精品v欧美精品v日韩精品|
在线观看一区|
亚洲欧美日韩精品久久久|
老牛嫩草一区二区三区日本|
亚洲视频综合|
国模精品娜娜一二三区|
国产精品免费一区二区三区观看|
午夜精品区一区二区三|
亚洲美女一区|
欧美日本不卡高清|
亚洲第一黄色|
欧美福利网址|
毛片一区二区|
午夜一区二区三区不卡视频|
激情亚洲成人|
欧美国产三级|
久久综合九色综合久99|
午夜在线一区二区|
中日韩视频在线观看|
激情亚洲成人|
国产自产精品|
欧美日韩精品久久|
久久久777|
免费在线国产精品|
国产精品夜夜夜|
日韩一级欧洲|
精品动漫一区|
影音先锋中文字幕一区|
国产精品草草|
欧美精品麻豆|
欧美一区二区三区久久精品茉莉花|
久久久亚洲人|
久久久精品网|
美女国产一区|
午夜亚洲影视|
久久精品导航|
久久一二三区|
欧美影视一区|
免费日韩av片|
久久黄色网页|
欧美伊人影院|
欧美日一区二区三区在线观看国产免|
欧美暴力喷水在线|
欧美久久九九|
好看的日韩av电影|
在线播放豆国产99亚洲|
亚洲精品欧洲精品|
国产精品一区二区在线观看|
午夜在线观看免费一区|
久久久xxx|
欧美日韩国产亚洲一区|
伊人精品在线|
在线视频免费在线观看一区二区|
亚洲精品美女|
久久婷婷亚洲|
激情欧美日韩一区|
国产精品一卡|
欧美精品色网|
国产日韩欧美一区二区|
久久综合一区|
亚洲经典在线看|
亚洲一区精彩视频|
欧美精选一区|
国产精品腿扒开做爽爽爽挤奶网站|
美女网站久久|
国内成人在线|
国产精品一区二区欧美|
欧美日韩一区在线视频|
一区二区三区欧美在线|
亚洲欧美大片|
久久婷婷一区|
亚洲激情一区|
久久久综合香蕉尹人综合网|
国产中文一区|
国产精品美女久久久|
欧美日韩国产高清|
一本一本久久a久久精品综合妖精|
免费亚洲视频|
亚洲国产一区二区精品专区|
亚洲一区不卡|
狠狠88综合久久久久综合网|
亚洲一区3d动漫同人无遮挡|
精品99视频|
欧美一区在线看|
国产精品久久久久9999高清|
亚洲性图久久|
亚洲欧美一级二级三级|
午夜在线精品偷拍|
日韩视频一区二区三区在线播放免费观看|
老色鬼久久亚洲一区二区|
国产偷久久久精品专区|
在线视频观看日韩|
国产精品观看|
午夜精品久久|
久久五月激情|
久久精品国产第一区二区三区最新章节
|
国产日韩欧美一区二区|
国产私拍一区|
欧美日韩精品免费看|
午夜亚洲视频|
亚洲一区二区精品在线|
亚洲黄色大片|
精品91视频|
黑丝一区二区三区|
午夜精品婷婷|
欧美精品一区二区视频|
欧美激情视频一区二区三区在线播放
|
国产一区在线免费观看|
欧美日韩精品免费看|
欧美激情第二页|
欧美成人综合一区|
欧美影院一区|
欧美精品1区|
欧美日韩成人一区二区三区|
欧美精品啪啪|
精品91在线|
亚洲日本免费|
国产精品亚洲产品|
久久精品五月|
欧美不卡福利|
久久国产福利|
欧美激情1区2区|
国产精品99免费看|
亚洲国产精品一区二区第四页av|
亚洲经典在线看|
国产午夜精品在线|
欧美一区二区视频在线|
欧美午夜影院|
夜夜嗨一区二区|
久久精品日韩|
很黄很黄激情成人|
国产一区二区三区久久|
欧美69视频|
国内久久精品|
国产精品久久久亚洲一区|
亚洲免费影院|
国外成人免费视频|
亚洲一区二区在线免费观看|
欧美一区免费|
影音先锋在线一区|
美女日韩在线中文字幕|
伊人激情综合|
久久久久久九九九九|
欧美日韩一区二区视频在线观看
|
国产精品久久亚洲7777|
欧美国产专区|
国产日产高清欧美一区二区三区|
欧美专区18|
亚洲精品裸体|
欧美成人嫩草网站|
一本色道久久综合亚洲精品不|
女同性一区二区三区人了人一|
亚洲欧洲视频|
久久在线91|
国产私拍一区|
亚洲人www|
国产精品chinese|
久久久精品午夜少妇|
亚洲美女视频在线免费观看|
国内精品福利|
欧美日韩亚洲一区二区三区四区|
麻豆av一区二区三区|
在线一区日本视频|
黄色亚洲大片免费在线观看|
老妇喷水一区二区三区|
亚欧成人精品|
亚洲综合丁香|
国产精品腿扒开做爽爽爽挤奶网站|
亚洲一级网站|
国产精品xxx在线观看www|
久久先锋影音|
欧美亚洲免费在线|
国产精品有限公司|
一区二区三区四区国产|
亚洲精选91|
亚洲国产网站|
在线 亚洲欧美在线综合一区|
欧美日韩免费高清|
欧美另类高清视频在线|
你懂的网址国产 欧美|
久久久久高清|
亚洲欧美综合|
欧美1级日本1级|
午夜欧美精品久久久久久久|
欧美精品在线一区|
国产精品国产精品|
在线成人欧美|
夜夜嗨一区二区三区|
一区二区三区偷拍|
亚洲欧美日韩在线观看a三区|
av不卡在线看|
国产精品久久九九|
国产精品一二|
国产精品亚洲综合久久|
亚洲毛片网站|
亚洲美洲欧洲综合国产一区|
99香蕉国产精品偷在线观看|
国产日韩精品一区观看
|
中文亚洲字幕|
久久欧美肥婆一二区|
欧美韩日精品|
亚洲全部视频|
免费日韩av|
老牛嫩草一区二区三区日本|
欧美日韩在线不卡一区|
亚洲三级观看|
久久久天天操|
影音先锋久久资源网|
亚洲免费在线|
亚洲午夜黄色|
午夜在线一区二区|
亚洲私人影院|
午夜影院日韩|
在线国产日韩|
欧美在线91|
国产一区二区三区黄|
欧美日韩专区|
久久大逼视频|
亚洲人成免费|
欧美体内she精视频在线观看|
亚洲激情精品|
欧美激情 亚洲a∨综合|
一本色道久久精品|
欧美精品三级|
亚洲欧美日韩视频二区|
一区在线电影|
久久欧美肥婆一二区|
在线视频观看日韩|
欧美国产综合|
久久精品二区三区|
中日韩男男gay无套|
亚洲图片在线观看|
午夜精品影院|
久久蜜桃资源一区二区老牛|
一区二区三区成人精品|
在线国产日韩|
国外成人免费视频|
欧美精品麻豆|
久久精品网址|
免费亚洲一区二区|
国产欧美日韩一区|
欧美搞黄网站|
国产亚洲欧美另类一区二区三区|
黄色亚洲在线|
黑人巨大精品欧美一区二区小视频|
久久久青草婷婷精品综合日韩
|
亚洲女人av|
99国产精品私拍|
激情视频一区二区|
一区二区在线不卡|
精品动漫一区|
亚洲成人自拍视频|
国产一区二区三区四区老人|
欧美一区2区三区4区公司二百|
午夜在线一区二区|
免费在线亚洲|
老**午夜毛片一区二区三区|
久久精品女人|
亚洲欧美综合|
国语精品一区|
亚洲国产高清一区二区三区|
亚洲黄色av|
国产视频一区免费看|
香蕉成人久久|
久久青青草综合|
欧美精品一区二区视频
|
在线免费观看欧美|
亚洲黄页一区|
中国成人亚色综合网站|
亚洲欧美网站|
欧美三级乱码|
亚洲国产美女|
国产欧美日韩在线播放|
免费在线一区二区|
国产一区免费视频|
国产欧美一区二区三区另类精品|
国产乱人伦精品一区二区|
美女久久一区|
国产在线欧美日韩|
国产一区二区精品|
久久亚洲精选|
亚洲国产日韩在线|
欧美一级久久|
亚洲一二区在线|
亚洲专区欧美专区|
国产精品99免费看|
国产伦精品一区二区|
国产精品va|
香蕉精品999视频一区二区|
欧美精品尤物在线|
最新日韩av|
乱码第一页成人|
亚洲福利免费|
久久久久久9|
91久久精品国产91久久性色tv|
媚黑女一区二区|
在线欧美日韩|
欧美日本精品|
亚洲男人影院|
亚洲精选一区|
欧美日韩四区|
久久国产成人|
一区二区动漫|
国产综合激情|
美女诱惑一区|
国产精品有限公司|
最新亚洲视频|
国内激情久久|
欧美黄污视频|
久久亚洲影院|
久久国产欧美精品|
亚洲一区二区三区免费观看|
伊人蜜桃色噜噜激情综合|
欧美福利电影在线观看|
亚洲中字黄色|
一区二区三区精品视频在线观看|
国产在线欧美日韩|
欧美日本亚洲韩国国产|
老妇喷水一区二区三区|
美女精品网站|
美女久久一区|
亚洲欧美春色|
亚洲欧美久久久|
国产伦理一区|
亚洲一区二区三区高清|
99在线精品视频在线观看|
在线观看不卡|
亚洲国产高清视频|
亚洲高清av|
在线精品福利|
亚洲精品乱码久久久久久蜜桃麻豆|
亚洲婷婷在线|
在线观看欧美一区|
亚洲国产美女|
99re热精品|
国产亚洲亚洲|
免费不卡亚洲欧美|
久久婷婷一区|
欧美天堂亚洲电影院在线观看
|
国产精品久久777777毛茸茸|
99亚洲伊人久久精品影院红桃|
国产综合网站|
黑人巨大精品欧美一区二区小视频|
国产精品yjizz|
亚洲国产三级|
国产精品久久久久久久久久直播|
国产精品一区二区三区四区五区|
亚洲一区二区免费看|
久久电影一区|
欧美久久影院|
91久久视频|
国产女主播一区二区三区|
午夜在线精品|
国产精品v一区二区三区|
亚洲激情啪啪|
久久xxxx|
影音先锋亚洲电影|
国产精品一区在线播放|
久久久夜精品|
亚洲国产精品一区二区第一页|
国产精品久久久久久久久久妞妞|
久久久久久久久久久一区|
欧美天堂亚洲电影院在线观看|
亚洲伦伦在线|
美女诱惑一区|
亚洲欧洲日本国产|
久久久久一区二区|
在线看片成人|
久久精品亚洲一区二区|
亚洲天堂激情|
美女视频一区免费观看|
激情欧美日韩|
美女久久一区|
亚洲精品色图|
欧美高清视频一区|
在线亚洲自拍|
国产综合色产|