النتائج 61 إلى 75 من 122
- 24-02-2016, 12:51 PM #61
استاذ ريمون
هل الذي وضعته هو ناسخ للصفقات بين منصات ميتاتريدر
ممكن مثال كيف نضع المعطيات في الماستر و السليف؟ لنسخ الصفقات
- 24-02-2016, 12:59 PM #62
- 24-02-2016, 01:15 PM #63
طيب في الانتظار و شكرا لكم
- 25-02-2016, 04:47 PM #64
هديتي للأستاذ وضاح عطار (صاحب الفكرة الاصلية لنقل البيانات عن طريق استخدام نافذة سطح)
وهديتي للمبرمجين والمتاجرين
إكسبيرت ناسخ الصفقات بين المنصات (على نفس الجهاز)
مع ملف mqh يتيح إمكانية ادارج خاصية نقل البيانات النصية في أي إكسبيرت والاستفادة منها بسهولة
** تحت التجربة
** ارجو التجربة وادراج الأخطاء لتصحيحها
هو إكسبيرت واحد فقط
نختار اذا كان مرسل ام مستقبل من الاعدادات
شرح الاعدادات
1- زمن فحص الصفقات
وهو من 20 الى 1000
كل 1000 تمثل ثانية واحدة
وكلما قل الزمن كان النسخ اسرع ولكن قد تحدث أخطاء نادره او يستهلك سرعة الجهاز
2- كود الاتصال بين المرسل والمستقبل ويجب ان يكون متشابه في النسختين لتتعرف كل منهما على الأخرى
3- مرسل او مستقبل (اجعله مرسل في الحساب الذي تريد ان تنسخ منه الصفقات)
4- ماجيك
اذا كان مرسل سيكون ماجيك الصفقات التي نريد نسخها
اذا كان مستقبل سيكون ماجيك الصفقات التي نفتحها على هذا الحساب
5- احداث أصوات فتح الصفقات (قد لا يعمل الصوت - سوف ادرج ملف الصوت داخل الإكسبيرت لاحقا)
6- رقم يضرب في لوت الصفقة قبل فتحها ويستخدم اذا كان الحسابين ليس لهم نفس الرصيد للتوفيق بين هذا الاختلاف
اجعله 2 اذا كان الحساب الذي تنسخ اليه الصفقات به ضعف رصيد الحساب الاخر
7- عكس الصفقات
فتح بيع بدل الشراء وشراء بدل البيع في الحساب الذي سوف ننسخ اليه الصفقات
--يمكن تشغيل عدة نسخ من هذا الإكسبيرت مع تغيير كود الاتصال في الخيار رقم 2
ويجب ان يكون الكود نفسه في المرسل والمستقبل
وتغيير رقم الماجيك حسب الحاجة بحيث لا يحصل تعارضات بين الصفقات
-- يمكن فتح الإكسبيرت المرسل والمستقبل على نفس المنصة او على منصتين مختلفتين
---------------------------
- 25-02-2016, 04:51 PM #65
جعلت الإكسبيرت يتعرف تلقائيا على لاحقة أسماء العملات عن طريق هذه الحيله
كود PHP:string GetRealSymbolName(string symbol){
int i;
string sym;
for(i=0;i<SymbolsTotal(true);i++){
sym=SymbolName(i,true);
if(MarketInfo(sym,MODE_TRADEALLOWED)){
if(StringFind(symbol,sym)==0 || StringFind(sym,symbol)==0){return sym;}//==0 is start from it.
}
}
Alert(symbol," Not Found!!");
return"";
}
- 25-02-2016, 06:50 PM #66
فكرة عمل إكسبيرت ناسخ الصفقات هي:-
المرسل يقوم بمراجعة وقراءة جميع الصفقات الشغالة بعد تصفيتها عن طريق رقم الماجيك
ثم دمج اسم الصفقات واللوت ورقم التكت لجميع الصفقات في صورة نص واحد مفصول بفصلات معينة لتسهيل الفصل لاحقا
ثم يرسل النص الى ذاكرة سطح المكتب وينتظر المرسل الى ان يتم اختفاء النص من ذاكرة سطح المكتب وهذا معناه انه تم التوصيل
يقوم وقتها المستقبل بقراءة ذاكرة سطح المكتب وعندما يجد الكود المتفق عليه يقوم بقراءة النص ثم حذفه من الذاكرة
مع ملحوظة حذف النص الخاص به فقط وليس كامل النص لانه يمكن ان يكون هناك بيانات أخرى تخص إكسبيرت اخر
ثم يفصل النص ويحولة الى أسماء الصفقات وبياناتها مرة أخرى
ثم يقارن النص والصفقات التي به بالصفقات المفتوحة
ويفتح الصفقات التي ليست مفتوحة ويغلق الصفقات التي ليست موجودة في لستة الصفقات القادم من المرسل
ملاحظات الأمان
يقوم المرسل بإرسال النص وارسال طول النص أيضا حتى نعرف اذا كان النص كامل ام ناقص ونتحاشى اغلاق الصفقات التي ليست موجودة في هذا النص
لا نرسل نص الى ذاكرة سطح المكتب إلا اذا اختبرناها وتبين ان اخر نص ارسلناه غير موجود أي تم استقباله حتى لا تمتلئ ذاكرة سطح المكتب بدون فائدة
يقوم المرسل والمستقبل بتفريغ محتويات ذاكرة سطح المكتب من أي بيانات خاصة بالاكسبيرت عند بداية التشغيل حتى لا ينفذ بيانات واوامر سابقة وأيضا يفرغ الذاكرة قبل اغلاق الإكسبيرت.
افراغ الذاكرة يكون بحذف جميع النصوص الخاصة بنا فقط أي التي تحتوى على كود التعرف الخاص بالاكسبيرت وليس كامل الذاكرة عن طريق قراءة الذاكرة ثم حذف النص الخاص به ثم كتابتها مرة أخرى ، وبهذا يمكن مشاركة الذاكرة مع عدة اكسبيرتات أخرى تراعي هذه القواعد وهي التعامل مع ذاكرتها فقط وليس كامل الذاكرة.
نكتب رقم التكت للصفقة الاصلية في كومنت الصفقة المنسوخة لنراجع ذلك الرقم لاحقا وذلك لعدم فتح صفقات مكررة ولمعرفه اذا كانت تلك الصفقة موجودة ام لا لانه يمكن ان تكون عدة صفقات بنفس اللوت واختلاف الربح ونحن نريد قفل صفقة معينة لا نعرف ايهما فعندها نقفل الصفقة التي قفلت نفسها عن طريق تمييزها برقم التكت من الكومنت.
آخر تعديل بواسطة remon78eg ، 25-02-2016 الساعة 06:54 PM
- 25-02-2016, 07:03 PM #67
كيف يمكن الاستفادة من ناسخ الصفقات لتحقيق ربح من إكسبيرت لا يحقق ربح!!
اول طريقة هي استخدام النسخ العادي بدون عكس الشراء والبيع
وذلك عن طريق تشغيل إكسبيرت على حساب ديمو له اسبريد كبير وضبط ربح الإكسبيرت على صفر
ثم وضع ناسخ الصفقات المرسل علي هذا الديمو ثم وضع المستقبل على حساب اخر حقيقي يكون له اسبريد اقل
فعندما تغلق الصفقات الديمو على صفر ربح تكون صفقات الحساب الحقيقي قد كسبت فرق الإسبريد
ثاني طريقة هي استخدام اختيار النسخ المعكوس (شراء يصبح بيع والعكس)
وتشغيل إكسبيرت مضاعفات على الحساب الديمو من النوع الذي يحقق خسارة كبيرة أولا قبل تحقيق ربح قليل
ثم ضبط الإكسبيرت الديمو ان يغلق عند استوب معين بخسارة معينة فعندما يغلق بخسارة يكون الإكسبيرت على الحساب الاخر الحقيقي قد حقق ربح.
- 25-02-2016, 07:23 PM #68
ثالث طريقة والتي انوي ان اتبعها وهي تشغيل إكسبيرت هيدج على حساب ديمو
وجعل ناسخ الصفقات لا ينسخ الهيدج ولكن ينسخ الصفقات التي تصبح مفرده
وضبط الإكسبيرت الديمو ان يغلق على صفر ربح فعندها يغلق الحساب الحقيقي على ربح بمقدار فرق اسبريد الهيدج الذي لم نفتحه وقمنا بتوفيره
ميزه عدم نسخ الهيدج لا يمكن دمجها في اكسبيرت ناسخ الصفقات لانه لا يعلم هل الصفقة التي فتحت الان سوف يفتح لها هيدج ام ستظل صفقة مفرده، وعندها سوف يقوم ناسخ الصفقات بنسخ الصفقة المفردة ثم يفاجئ بفتح هيدج لها ،، واذا انتظر حتى يعرف اذا كانت الصفقة سوف تفتح هيدج ام لا فعندها سيفتح على سعر اخر بفارق خمس ثواني مثلا او اكثر.
لذلك سوف اجعل الإكسبيرت الاصلي على الديمو هو الذي ينسخ الصفقات ويرسلها للحساب الحقيقي المستقبل (لانه يعلم اذا كان سيفتح هيدج ام لا) وذلك عن طريق دمج إكسبيرت ناسخ الصفقات مع الإكسبيرت الاخر.آخر تعديل بواسطة remon78eg ، 25-02-2016 الساعة 07:27 PM
- 25-02-2016, 10:09 PM #69
ملحوظة هامة
ناسخ الصفقات هذا لا يعمل مع الأوامر التي تغلق ب (كلوز باي)
لانه سوف يغلق اغلاق عادي
وأيضا ستحدث مشاكل اذا أغلقت جذء من الصفقة لانه لن يغلق جذء منها او يعلم ان جذء منها اغلق
ولو كان الاغلاق الجذئي يغير رقم التكت فسوف يغلق الصفقة ويفتح غيرها بلوت اقل
وأيضا لا يعمل جيداً بطريقة الاغلاق ب (كلوز باي) التي ابتكرها الأستاذ وضاح عن طريق فتح هيدج
لانه سوف يفتح الهيدج ويغلق بدون كلوز باي وستكون وقتها الخسارة في الإسبريد كبيرة جداً.
- 25-02-2016, 11:33 PM #70
- 26-02-2016, 09:44 AM #71
نفترض ان لديك إكسبيرت بيفتح هيدج (على نفس العملة)
أي انه بيفتح بيع وبيفتح شراء على نفس العملة وفي نفس اللحظة
وبينتهي بقفل البيع والشراء بحيث ان المحصلة تساوي مكسب او حتى تعادل كما سنفعل
نفترض ان الإكسبيرت فتح بيع وشراء لليورو دولار
نفترض ان الإسبريد كان 10 دولار
بعد فترة ارتفع السعر وحقق الشراء مكسب 100 دولار
قفلنا الشراء بمكسب 100 دولار
البيع الان خسران -100 دولار -10-10 سبريد
المحصلة 100 مكسب البيع -100 -20 دولار تساوي خسارة -20 دولار
على الإكسبيرت الان من تلك اللحظة ان يكسب 20 دولار لكي يخرج فقط على تعادل
فلو دخنا مع الإكسبيرت ونسخنا صفقاته من تلك اللحظة سنخرج معه على صفر تعادل
والتي هي بالنسبة لنا تعتبر +10 دولار لأننا لم ندفع اسبريد الشراء
فنقطة الصفر التي بدأنا منها هي -10 دولار (سبريد)
بينما الإكسبيرت عندما بدأ من نقطة الصفر كان -20 دولار
آخر تعديل بواسطة remon78eg ، 26-02-2016 الساعة 09:47 AM
- 26-02-2016, 11:59 AM #72
- 26-02-2016, 12:42 PM #73
بعد اغلاق الشراء
اصبحت الان صفقة البيع فقط هي الموجودة
حينها سيبدأ الإكسبيرت في التعامل مع الصعود بفتح بيع اخر واخر واخر (كل عدد نقاط معينة او حسب الاستراتيجية)
ولن يفتح أي شراء اخر الى ان يغلق صفقات البيع كلها ويبدأ من جديد (بهيدج او بصفقة مفردة حسب موقعة من الدعم والمقاومة)
عادة يتم قفل الشراء عند نقطة مقاومة فيكون عندها احتمال الهبوط كبير
بالإضافة الى ان الإكسبيرت يتعامل بعدة ازواج كل زوج على حدى في مضاعفاته ولكن ربحهم مشترك،
وأيضا الصفقات التي تغلق يتم تخذين ربحها حتى اذا كان مجمل ربح جميع الصفقات الشغاله والمغلقة
من زمن بداية الجلسة مساوي رقم معين فسيتم اغلاق الجميع معا وبهذا تحمل الصفقات الرابحة المغلقة والشغالة بعض من خسارة المضاعفات وتسرع عملية الاغلاق والخروج على ربح مبكرا عما اذا استخدمنا عملة واحدة.
- 27-02-2016, 12:40 PM #74
هذا هو الإصدار الجديد من برنامج ناسخ الصفقات
به بعض التحديثات منها
إمكانية عدم نسخ الهيدج إلا بعد فكه (فقط لتوفير الإسبريد ،، وهو يكون اكبر من الربح نفسه عند الإسكالبنج).
التعرف على أسماء العملات تلقائيا حتى وان كانت هناك لاحقة مختلفة لكل نوع حساب (micro - pro).
ReadWrite.mqh
كود PHP://#property copyright "Copyright 2016, Eng. Waddah Attar , remon78eg"
//=====================================================================================
//By Remon78eg , 24/02/2016
//طريقة العمل هي كالتالي
//يبدأ البرنامج ريت بكتابة الرسالة الى الذاكرة المشتركة عن طريق اضافتها
//قبل اضافتها يختبر اذا كانت موجودة ام لا
//هنا تظهر اهمية اضافة التك كونت لانه ان كان هناك امر سابق لم يتم استقباله وحذفه له نفس المدخلات فلن يضاف مرة اخرى
//مثل امر فتح صفقة بنفس اللوت السابق ونفس العملة والبيانات
//ينتظر البرنامج ريت الى ان تصل رسالته الى الذاكرة المشتركة عن طريق اعادة قرائتها
//هنا ينتهي عمل البرنامج ريت او انه يظل منتظر الاستلام حسب الاعدادات
//يبدا عمل برنامج ريد بقراءة الذاكرة المشتركة
//حتى يرى كود مشترك متفق عليه شير ايدي يقرأه ويحذفة من الذاكرة المشتركة لكي لا يقرأه مرة اخرى
//ويتأكد من انه تم حذفة بإعادة قراءة الذاكرة مرة اخرى
//=====================================================================================
//input string SHARED_ID="ABC123456789";
#import "user32.dll"
int GetDesktopWindow ();
int GetWindow (int, int);
int SendMessageW(int hWnd,int Msg,int wParam,string lParam);
int GetWindowTextA(int hWnd,char &lpString[],int nMaxCount);
int GetWindowTextLengthA(int hWnd);
#import
string PendingData="";
int MyID=WindowHandle(Symbol(),PERIOD_CURRENT);
int hWnd_Desktop=0;// = GetWindow(GetDesktopWindow(),5);
/*
input int msSleep=100;
void OnInit(){
EventSetMillisecondTimer(msSleep);
}
void OnDeinit(const int reason){
string name,val;
EventKillTimer();
while(ReadData(name,val,true)){}//Empty Memory if not need it anymore
}
void OnTimer(){
string name,val;
static bool imin=false;
if(imin)return;
imin=true;
while(ReadData(name,val)){Alert(name," = ",val);if(IsStopped())return;}
imin=false;
}
void OnTick(){
static int i=0;
//WriteData("Bid",string(Bid));
i++;
WriteData("i",(string)i,SHARED_ID);
WritePendingData(hWnd_Desktop,10000);
}
*/
//--------------------------------------------------------------------------------------
bool WritePendingData(int sendto,int TimeOutS=60,bool WaitTillArrived=false){
string arr[];
string tmp,s;
datetime t=TimeCurrent();
if(!ReadyToReceive())return false;
if(PendingData=="" || PendingData==NULL){return false;}
if(sendto<=0)return false;
Split(PendingData,"<<end>>",arr);
if(arr[0]=="" || arr[0]==NULL)return false;
s=arr[0]+"<<end>>";//اضافة الخاتمة لانها حذفت من سبلت
while(true){
tmp=GetWindowText(sendto);//قراءة محتويات الذاكرة
if(StringFind(tmp,s)>=0){break;}//اذا كان النص موجود لا نعيد ارساله
SendMessageW(sendto, 0xc, 0, tmp+s);//اضافة النص الجديد الى الذاكرة وارساله
//if(TimeCurrent()-t>=TimeOutS)return false;
break;
}
StringReplace(PendingData,s,"");//حذف الرسالة التي ارسلت من قائمة الانتظار لكي لا نرسلها مرة اخرى
while(WaitTillArrived){
tmp=GetWindowText(sendto);//قراءة محتويات الذاكرة
//if(StringFind(tmp,s)==-1 && StringFind(tmp,"Default IME")>=0){break;}//اذا كان النص غير موجود فتم الاستقبال جيدا
if(StringFind(tmp,s)==-1){break;}//اذا كان النص غير موجود فتم الاستقبال جيدا
if(TimeCurrent()-t>=TimeOutS)return false;
Sleep(20);
}
return true;
}
//---------------------------------------------------
void WriteData(string name,string val,string SharedID,int TimeOutS=60){//(data format is) |RW| MAGIC_ID * MyID <<:::>> name <<===>> val <<tic>> GetTickCount() <<end>> (without spaces)
PendingData+="|RW|"+SharedID+"*"+string(MyID)+"<<:::>>"+name+"<<===>>"+val+"<<tic>>"+string(GetTickCount())+"<<end>>";
if(hWnd_Desktop<=0){hWnd_Desktop= GetWindow(GetDesktopWindow(),5);}
WritePendingData(hWnd_Desktop,TimeOutS);//ارسال الى الذاكرة الخارجية المشتركة
}
//---------------------------------------------------------------------------------------
int Split(string str,string s,string & arr[]){//0,10,20,30 => arr[0,10,20,30]
int x=0,i=0,len;
string t;
len=0;
ArrayResize(arr,0);
while(true){
i=StringFind(str+s,s,x);//str+s
if(i==-1)return len;
t=StringSubstr(str,x,i-x);
if(i==x)t="";
len++;
ArrayResize(arr,len);
arr[len-1]=t;
x=i+StringLen(s);
}
return len;
}
//---------------------------------------------------------------------------------------
string GetWindowText(int hWnd){
char data[];
string str;
int i;
if(hWnd<=0){return "";}
i=GetWindowTextLengthA(hWnd);
if(i<=0){return "";}
ArrayResize(data,i+1);
GetWindowTextA(hWnd,data,i+1);
str=CharArrayToString(data);
return str;
}
//-----------------------------------------------------------------
bool ReadData(string &name,string &val,bool IncludeMine=false){//(data format is) |RW| MAGIC_ID * MyID <<:::>> name <<===>> val <<tic>> GetTickCount() <<end>> (without spaces)
string arr1[],arr2[],arr3[],arr4[],arr5[],tmp,str,s;
datetime t=TimeCurrent();
int n,i;
name="";val="";
if(hWnd_Desktop<=0){hWnd_Desktop= GetWindow(GetDesktopWindow(),5);}
str=GetWindowText(hWnd_Desktop);
//if(StringFind(str,"Default IME")<0){Alert("memory=",str);return false;}
n=Split(str ,"|RW|"+SHARED_ID+"*",arr1);//{return false;}//arr1[1]= MyID <<:::>> name <<===>> val <<tic>> GetTickCount() <<end>> ...
for(i=1;i<n;i++){
while(true){
if(Split(arr1[i],"<<:::>>" ,arr2)<2){break;}//arr2[0]= MyID , arr2[1]= name <<===>> val <<tic>> GetTickCount() <<end>> ...
if(arr2[0]==string(MyID) && !IncludeMine){break;}//قراءة المحتويات التي ارسلتها - يستخدم لتصحيح الاخطاء فقط
if(Split(arr2[1],"<<tic>>",arr3)<2){break;}//arr3[0]= name <<===>> val , arr3[1]= GetTickCount() <<end>> ...
if(Split(arr3[0],"<<===>>",arr4)<2){break;}//arr4[0]= name , arr4[1] = val
name=arr4[0];
val =arr4[1];
if(Split(arr1[1],"<<end>>",arr5)<1){break;}//arr5[0]= MyID <<:::>> name <<===>> val <<tic>> GetTickCount()
s="|RW|"+SHARED_ID+"*"+arr5[0]+"<<end>>";
while(true){
tmp=GetWindowText(hWnd_Desktop);//قراءة محتويات الذاكرة
if(StringFind(tmp,s)>=0){break;}//لابد ان يكون النص موجود اولا قبل حذفه
if(TimeCurrent()-t>=20)return false;
}
while(true){
StringReplace(tmp,s,"");//del from memory
SendMessageW(hWnd_Desktop, 0xc, 0, tmp);//اضافة النص الجديد الى الذاكرة وارساله
tmp=GetWindowText(hWnd_Desktop);//قراءة محتويات الذاكرة
//if(StringFind(tmp,s)==-1 && StringFind(tmp,"Default IME")>=0){break;}//اذا كان النص غير موجود فنخرج
if(StringFind(tmp,s)==-1){break;}//اذا كان النص غير موجود فنخرج
if(TimeCurrent()-t>=20)return false;
}
return true;
}}
return false;
}
//=====================================================================================
bool ReadyToReceive(){//no pending data still in public memory
string arr1[],arr2[],arr3[],arr4[],arr5[],tmp,str,s;
int n,i;
if(hWnd_Desktop<=0){hWnd_Desktop= GetWindow(GetDesktopWindow(),5);}
str=GetWindowText(hWnd_Desktop);
//if(StringFind(str,"Default IME")<0){Alert("memory=",str);return false;}
n=Split(str,"|RW|"+SHARED_ID+"*",arr1);// arr1[1]= MyID <<:::>> name <<===>> val <<tic>> GetTickCount() <<end>> ...
for(i=1;i<n;i++){
if(Split(arr1[i],"<<:::>>",arr2)<2){}else{if(arr2[0]==string(MyID)){return false;}}
}
return true;
}
//=====================================================================================
bool ClearJunkData(uint MaxTimeSec=120,bool BothExperts=false){
string arr1[],arr2[],arr3[],arr4[],arr5[],tmp,str,s;
int n,i;
uint t=GetTickCount();
if(hWnd_Desktop<=0){hWnd_Desktop= GetWindow(GetDesktopWindow(),5);}
str=GetWindowText(hWnd_Desktop);
n=Split(str ,"|RW|"+SHARED_ID+"*",arr1);//{return false;}//arr1[1]= MyID <<:::>> name <<===>> val <<tic>> GetTickCount() <<end>> ...
for(i=1;i<n;i++){
while(true){
if(Split(arr1[i],"<<:::>>" ,arr2)<2){break;}//arr2[0]= MyID , arr2[1]= name <<===>> val <<tic>> GetTickCount() <<end>> ...
if(arr2[0]!=string(MyID) && BothExperts==false){break;}
if(Split(arr2[1],"<<tic>>",arr3)<2){break;}//arr3[0]= name <<===>> val , arr3[1]= GetTickCount() <<end>> ...
if(Split(arr3[1],"<<end>>",arr4)<1){break;}//arr4[0]= GetTickCount()
if(t-uint(arr4[0])>=MaxTimeSec*1000){}else{break;}
if(Split(arr1[1],"<<end>>",arr5)<1){break;}//arr5[0]= MyID <<:::>> name <<===>> val <<tic>> GetTickCount()
s="|RW|"+SHARED_ID+"*"+arr5[0]+"<<end>>";
while(true){
tmp=GetWindowText(hWnd_Desktop);//قراءة محتويات الذاكرة
if(StringFind(tmp,s)>=0){break;}//لابد ان يكون النص موجود اولا قبل حذفه
if(TimeCurrent()-t>=20)return false;
}
while(true){
StringReplace(tmp,s,"");//del from memory
SendMessageW(hWnd_Desktop, 0xc, 0, tmp);//اضافة النص الجديد الى الذاكرة وارساله
tmp=GetWindowText(hWnd_Desktop);//قراءة محتويات الذاكرة
if(StringFind(tmp,s)==-1){break;}//اذا كان النص غير موجود فنخرج
if(TimeCurrent()-t>=20)return false;
}
return true;
}}
return false;
}
Trades.mqh
كود PHP:struct STR_DEALS_COPY{
string deal ;//EURUSD
string direction ;//B or S
//string comment ;//ABC123
//string magic ;//0123456789
string ticket ;//0123456789
string lot ;//0.01
};
//=====================================================================================
int OrdersTotals(int Magic){
int x=0,i;
bool error;
while(true){
x=0;
error=false;
for(i=0;i<OrdersTotal();i++){
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){RefreshRates();error=true;break;}
if((OrderMagicNumber()==Magic || Magic==-1) && (OrderType()==OP_BUY || OrderType()==OP_SELL)){x++;}
}
if(!error){break;}
}
return(x);
}
//==============================================
//==========================================================
int CopyAllTrades(int Magic,STR_DEALS_COPY &Trades[],bool I_HEDGE_NOT_COPY,int I_HEDGE_NOT_COPY_DELAY_SEC){
int x=0,i,n=1;
bool error;
while(true){
x=0;
error=false;
ArrayResize(Trades,OrdersTotal());
for(i=0;i<OrdersTotal();i++){
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){RefreshRates();error=true;break;}
if((OrderMagicNumber()==Magic || Magic==-1) && (OrderType()==OP_BUY || OrderType()==OP_SELL)){
if(I_HEDGE_NOT_COPY){
n=CanSend(Magic,OrderSymbol(),iif(OrderType()==OP_BUY,"B","S"));//-1=err,0=no ,1=yes , 2= wait timeout
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){RefreshRates();error=true;break;}//select again ,coz CanSend deselect it
}
if(n==-1){RefreshRates();error=true;break;}
if(n== 1 || (n==2 && TimeCurrent()-OrderOpenTime()>I_HEDGE_NOT_COPY_DELAY_SEC) || !I_HEDGE_NOT_COPY){//1=copy now , 2=copy but wait
Trades[x].deal =OrderSymbol ();
Trades[x].direction=iif(OrderType()==OP_BUY,"B","S");
Trades[x].ticket =(string)OrderTicket ();
Trades[x].lot =(string)OrderLots ();
x++;
}
}
}
if(!error){break;}
}
ArrayResize(Trades,x);
return(x);
}
//========================================
string TradesToString(STR_DEALS_COPY &Trades[]){
int i;
string s,ss="";
for(i=0;i<ArraySize(Trades);i++){
//s=Trades[i].deal+";"+Trades[i].comment+";"+Trades[i].direction+";"+Trades[i].magic+";"+Trades[i].ticket+";"+Trades[i].lot;
s=Trades[i].deal+";"+Trades[i].direction+";"+Trades[i].ticket+";"+Trades[i].lot;
ss+=iif(ss=="","","|");
ss+=s;
}
return ss;
}
//========================================
int StringToTrades(string T,STR_DEALS_COPY &Trades[]){
int i,n,m,w;
string s[],ss[],sss[];
n=StringSplit(T,'~',sss);
w=int(sss[0]);
if(w != StringLen(sss[1])){return -1;}//error in data length, missing data
n=StringSplit(sss[1],'|',ss);
//n=Split(T,"|",ss);
ArrayResize(Trades,n);
for(i=0;i<n;i++){
m=StringSplit(ss[i],';',s);
//m=Split(ss[i],";",s);
Trades[i].deal =GetRealSymbolName(s[0]);
//Trades[i].comment =s[1];
Trades[i].direction=s[1];
//Trades[i].magic =s[3];
Trades[i].ticket =s[2];
Trades[i].lot =s[3];
}
return n;
}
//========================================
int isDealOpen(int Magic,string Ticket){//-1=err 0=not found,1=found
int i;
for(i=0;i<OrdersTotal();i++){
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){RefreshRates();return -1;}
if((Magic==OrderMagicNumber() || Magic==-1) && Ticket==OrderComment()){return 1;}
}
return 0;
}
//==========================================
bool OpenDeal(int Magic,string eDEAL,string eD,double eLot,string eC){
int i=0;
int m;
if(eC=="0"){eC="1";}
eLot=NormalizeLot(eLot);
if(eLot==0){ObjectSetText("L1","Lot=0 "+eDEAL+" : "+eD,10,"Times New Roman",Red);Sleep(500);return false;}
if(eDEAL=="" || eDEAL==NULL){ObjectSetText("L1","DEAL=''",10,"Times New Roman",Red);Sleep(500);return false;}
if(eD=="" || eD==NULL ){ObjectSetText("L1","D=''",10,"Times New Roman",Red);Sleep(500);return false;}
//if(DEALS_SOUND)PlaySound("+12.wav");
m=OrdersTotals(Magic);
while(true){
if(IsStopped()){return false;}
if(IsExpertEnabled()==false || IsTradeAllowed()==false){PlaySound("alert2");Comment("Canot Open,Please Allow Auto");Print("Canot Open,Please Allow Auto!!");Sleep(1000);Sleep(1000);Sleep(1000);}
ObjectSetText("L1","Open "+eDEAL+" : "+eD,14,"Times New Roman",Green);
if(OrdersTotals(Magic)>m){break;}
if(eDEAL != "" && eD=="S"){ i=OrderSend(eDEAL,OP_SELL,eLot,SymbolInfoDouble(eDEAL, SYMBOL_BID),3000,0,0,eC,Magic,0,Red ); }
if(eDEAL != "" && eD=="B"){ i=OrderSend(eDEAL,OP_BUY ,eLot,SymbolInfoDouble(eDEAL, SYMBOL_ASK),3000,0,0,eC,Magic,0,Blue); }
if(OrdersTotals(Magic)>m){break;}
Alert("Error Open "+eDEAL+" Err="+(string)ErrorDescription(GetLastError()));Sleep(1000);Sleep(1000);Sleep(1000);
}
if(DEALS_SOUND)PlaySound("chime.wav");
return(true);
}
//*******************************************************************************************
//---------------------------------------------------------------------------------------
double NormalizeLot(double eLot){
double LotNrm,MinLot,LotStp;
MinLot=MarketInfo(Symbol(),MODE_MINLOT);
LotStp=MarketInfo(Symbol(),MODE_LOTSTEP);
LotNrm=MathRound((double)NUM(MathFloor(eLot/LotStp),2))*LotStp;
if(LotNrm<MinLot)return 0;
return(LotNrm);
}
//---------------------------------------------------------------------------------------
//----------------------------------------------
bool isDealClosed(STR_DEALS_COPY &Trades[],string Ticket){
int i,n=0;
for(i=0;i<ArraySize(Trades);i++){
if(Trades[i].ticket==Ticket)return false;
}
return true;
}
//=======================================
void SendAllTrades(int Magic,bool I_HEDGE_NOT_COPY,int I_HEDGE_NOT_COPY_DELAY_SEC){
int n;
STR_DEALS_COPY Trades[];
string TRADES;
n=CopyAllTrades(Magic,Trades,I_HEDGE_NOT_COPY, I_HEDGE_NOT_COPY_DELAY_SEC);
//if(n==0)return;
TRADES=TradesToString(Trades);
if(ReadyToReceive()){WriteData("TRADES",string(StringLen(TRADES))+"~"+TRADES,SHARED_ID,60);}
}
//========================================
int ReadAllTrades(STR_DEALS_COPY &Trades[]){
bool it;
string name,val;
int n=0;
it=ReadData(name,val);
if(name=="TRADES"){n=StringToTrades(val,Trades);}else{n=-1;}
return n;
}
//*******************************************************************************************
int OpenTheTrades(int Magic,STR_DEALS_COPY &Trades[],double lot_ratio,bool invert){
int i,n=0;
string d;
for(i=0;i<ArraySize(Trades);i++){
if(isDealOpen(Magic,Trades[i].ticket)==0){
d=Trades[i].direction;
if(invert){d=iif(d=="B","S","B");}
OpenDeal(Magic,GetRealSymbolName(Trades[i].deal),d,double(Trades[i].lot)*lot_ratio,Trades[i].ticket);
n++;
}
}
return n;
}
//-----------------------------------------
bool CloseTheTrades(int Magic,STR_DEALS_COPY &Trades[]){
int i,n=0;
bool v;
RefreshRates();
for(i=0;i<OrdersTotal();i++){
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)){RefreshRates();return true;}
if(Magic==OrderMagicNumber() || Magic==-1){
if(isDealClosed(Trades,OrderComment())){
if(OrderType()==OP_BUY ){v=OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(OrderSymbol(), SYMBOL_BID),3000,clrLightGreen);}
if(OrderType()==OP_SELL){v=OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(OrderSymbol(), SYMBOL_ASK),3000,clrLightPink );}
n++;
}
}
}
return n;
}
//==========================================
string GetRealSymbolName(string symbol){
int i;
string sym,s=symbol;
while(StringLen(symbol)>=1){
for(i=0;i<SymbolsTotal(false);i++){
sym=SymbolName(i,false);
if(MarketInfo(sym,MODE_TRADEALLOWED)){
if(StringFind(symbol,sym)==0 || StringFind(sym,symbol)==0){return sym;}//==0 is start from it.
}
}
symbol=StringSubstr(symbol,0,StringLen(symbol)-1);//may be EURUSDmicro && EURUSD. so del the last char (.) or (micro) and search again
}
Alert(s," Not Found!!");
return"";
}
//==========================================
color iif(bool con,color tr,color fl){
if(con){return(tr);}else{return(fl);}
}
int iif(bool con,int tr,int fl){
if(con){return(tr);}else{return(fl);}
}
double iif(bool con,double tr,double fl){
if(con){return(tr);}else{return(fl);}
}
string iif(bool con,string tr,string fl){
if(con){return(tr);}else{return(fl);}
}
//*******************************************************************************************
string NUM(double number,int n){
return(DoubleToStr(number,n));
}
//--------------------------------------------------------------------
int IsHedge(int Magic,string sym){//-1 error,1 yes,0 no//هل توجد صفقات باي وسل مفتوحة
int i;
bool buy=false,sell=false;
for(i=0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false){RefreshRates();return(-1);}
if((OrderType()==OP_BUY || OrderType()==OP_SELL) && ((OrderMagicNumber()==Magic || Magic==-1) && OrderSymbol()==sym)){
if(OrderType()==OP_BUY ){buy =true;}
if(OrderType()==OP_SELL){sell=true;}
}
if(buy && sell)return 1;
}
return(0);
}
//--------------------------------------------------------------------
int IsMarOpen(int Magic,string sym,string dir){//-1=err,0=not open,1=open
int i,n=0;
if(sym=="" || sym==NULL)return -1;
if(dir=="" || dir==NULL)return -1;
if(dir!="B" && dir!="S")return -1;
for(i=0;i<OrdersTotal();i++){
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false){RefreshRates();return(-1);}
if((OrderMagicNumber()==Magic || Magic==-1) && OrderSymbol()==sym){
if(dir=="B" && OrderType()==OP_BUY ){n++;}
if(dir=="S" && OrderType()==OP_SELL){n++;}
}
if(n>=2)return 1;
}
return(0);
}
//--------------------------------------------------------------------
int CanSend(int Magic,string sym,string dir){//-1=err,0=no ,1=yes , 2= wait timeout
int n;
n=IsHedge(Magic,sym);
if(n==-1){return -1;}//error
if(n== 1){return 0;}// not copy
n=IsMarOpen(Magic,sym,dir);
if(n==-1){return -1;}//error
if(n== 1){return 1;}//copy now
return 2;//copy but wait for time out
}
//--------------------------------------------------------------------
كود PHP:#property copyright "Copyright 24/02/2016, remon78eg"
#property version "3.00"
#property strict
#include "ReadWrite.mqh"
#include "Trades.mqh"
#include <stderror.mqh>
#include <stdlib.mqh>
enum e_TRADE_TYPE{
TYPE_COPY_NON=-1,// اختار اتجاه النسخ
TYPE_COPY_SRC=0, // نسخ الصفقات من هنا (مرسل)
TYPE_COPY_TRG=1,// لصق الصفقات هنا (ماجيك جديد)(مستقبل)
};
input int msSleep=100;//اقل زمن لفحص الصفقات بالميلي ثانيه
input string SHARED_ID="COPIER-V3-MAGIC=111";
input e_TRADE_TYPE EXPERT_TYPE=TYPE_COPY_NON;//اتجاه النسخ
input int MAGIC=0;//Magic , (-1 = All Trades)
input bool DEALS_SOUND=true;
input double LOT_RATIO=1;//LOT RATIO - رقم يضرب في اللوت قبل فتح الصفقة
input bool INVERT=false;//INVERT Buy<->Sell- عكس الصفقات
input bool HEDGE_NOT_COPY=false;//لا تنسخ الهيدج
input int HEDGE_NOT_COPY_DELAY_SEC=5;//زمن تأخير نسخ الهيدج بالثواني
int OnInit(){
if(!IsDllsAllowed()){MessageBox("Dll Not Allowed!!","Will Exit!!");return 1;}
if(EXPERT_TYPE==TYPE_COPY_NON){MessageBox("اختار اتجاه النسخ!!","Will Exit!!");return 1;}
if(EXPERT_TYPE==TYPE_COPY_TRG && MAGIC==0){MessageBox("قم بتغيير رقم الماجيك نمبر لرقم فريد!!","Will Exit!!");return 1;}
EventSetMillisecondTimer(msSleep);
while(ClearJunkData(0,true)){}//Empty Memory if not need it anymore
return INIT_SUCCEEDED;
}
void OnDeinit(const int reason){
EventKillTimer();
while(ClearJunkData(0,true)){}//Empty Memory if not need it anymore
}
void OnTimer(){
int n;
string name,val,str;
STR_DEALS_COPY Trades[];
static bool imin=false;
if(imin)return;
imin=true;
if(EXPERT_TYPE==TYPE_COPY_SRC){SendAllTrades(MAGIC,HEDGE_NOT_COPY,HEDGE_NOT_COPY_DELAY_SEC);}
if(EXPERT_TYPE==TYPE_COPY_TRG){
n=ReadAllTrades(Trades);
if(n>=0){
OpenTheTrades(MAGIC,Trades,LOT_RATIO,INVERT);
CloseTheTrades(MAGIC,Trades);
}
}
imin=false;
}
void OnTick(){
OnTimer();
}
- 27-02-2016, 01:48 PM #75
الله ينور عليك استاذ ريمون
شغل مرتب