!Control





//+------------------------------------------------------------------+
//|                                                        Dupel.mq4 |
//|                                Copyright © 2009, Ñåðãååâ Àëåêñåé |
//|                                      mailto: profy.mql@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Ñåðãååâ Àëåêñåé"
#property link      "mailto: profy.mql@gmail.com"

int i, j, type, w;
string name, st, var;
int obj, fo;
double d;
bool b, bNeedUpdate;
int gType, sType;
string gText, sText;
double gProp[232], sProp[232];
string names[1000];
//------------------------------------------------------------------
int start()
{
	while(!IsStopped())
	{
		Sleep(1000);
		bNeedUpdate=false;
		//ñîõðàíÿåì
		var="DupelSync_"+Symbol()+Period();
		if (!GlobalVariableCheck("DupelSync")) GlobalVariableSet("DupelSync", 0); // ñîçäà¸ì, åñëè íåò
		if (!GlobalVariableCheck("DupelSync_"+Symbol()+Period())) GlobalVariableSet("DupelSync_"+Symbol()+Period(), -1); // ñîçäà¸ì, åñëè íåò

		if (GlobalVariableGet(var)>0) // åñëè ýòà âàëþòà ïèñàòåëü
		{
			Comment("writter");
			if (GlobalVariableSetOnCondition("DupelSync", 1, 0))
			{
				obj=FileOpen("DupelSync.txt", FILE_CSV|FILE_WRITE); 
				if (obj<0) { Print("Íå ñìîãëè çàïèñàòü!"); GlobalVariableSet("DupelSync", 0); continue; }
				FileSeek(obj, 0, SEEK_SET);
				for (i=0; i<ObjectsTotal(); i++) 
				{
					name=ObjectName(i); 
					if (ObjectFind(name)!=0) continue; // áåð¸ì òîëüêî ãëàâíîå îêíî
					FileWrite(obj, name);  // ñîõðàíèëè èìÿ
					FileWrite(obj, ObjectType(name)); // ñîõðàíèëè òèï
					FileWrite(obj, ObjectDescription(name));  // ñîõðàíèëè îïèñàíèå
					for (j=0; j<=16; j++) FileWrite(obj, DoubleToStr(ObjectGet(name, j), Digits));
					for (j=100; j<=103; j++) FileWrite(obj, DoubleToStr(ObjectGet(name, j), Digits));
					for (j=200; j<=203; j++) FileWrite(obj, DoubleToStr(ObjectGet(name, j), Digits));
					for (j=210; j<=231; j++) FileWrite(obj, DoubleToStr(ObjectGet(name, j), Digits));
				}
				FileClose(obj);
				GlobalVariableSet("DupelSync", 0);
			}
		}
		if (GlobalVariableGet(var)<=0)  // åñëè ýòà âàëþòà ÷èòàòåëü
		{
			Comment("lister");
			if (GlobalVariableSetOnCondition("DupelSync", 1, 0))
			{
				obj=FileOpen("DupelSync.txt", FILE_CSV|FILE_READ); 
				if (obj<0) { Print("íå ñìîãëè îòêðûòü"); GlobalVariableSet("DupelSync", 0); continue; }
				
				// ñðàâíèâàåì íàëè÷èå îáúåêòîâ
				w=0;
				FileSeek(obj, 0, SEEK_SET);
				while (!FileIsEnding(obj))  // ÷èòàåì äàííûå îáúåêòîâ èç ôàéëà
				{
					names[w]=FileReadString(obj); if (names[w]=="") break;
					w++;
					st=FileReadString(obj); // òèï îáúåêòà
					st=FileReadString(obj); // òåêñò
					for (j=0; j<=16; j++) st=FileReadString(obj); for (j=100; j<=103; j++) st=FileReadString(obj);
					for (j=200; j<=203; j++) st=FileReadString(obj); for (j=210; j<=231; j++) st=FileReadString(obj);
				}
				// ïðîõîäèì ïî òåêóùèì è ñðàâíèâàåì íàëè÷èå îáúåêòîâ
				for (i=0; i<ObjectsTotal(); i++)
				{
					b=true;
					name=ObjectName(i);  // ïîëó÷èëè èìÿ 
					if (ObjectFind(name)>0) continue; // åñëè îáúåêò íå íà ãëàâíîì ãðàôèêå, òî ïðîïóñêàåì
					for(j=0; j<w; j++) if (name==names[j]) b=false; // åñëè íàøëè îáúåêò, òî ïðîïóñêàåì
					if (b) { ObjectsDeleteAll(0, -1); bNeedUpdate=true; break; } // óäàëÿåì âñå ëèøíèå îáúåêòû
				}
				
				// òåïåðü êîïèðóåì ñâîéñòâà
				FileSeek(obj, 0, SEEK_SET);
				while (!FileIsEnding(obj))  // ÷èòàåì äàííûå îáúåêòîâ èç ôàéëà
				{
					b=false;
					name=FileReadString(obj); if (name=="") break; // èìÿ îáúåêòà
					gType=StrToInteger(FileReadString(obj));  // òèï îáúåêòà
					gText=FileReadString(obj);  // òåêñò îáúåêòà
					for (j=0; j<=16; j++) gProp[j]=StrToDouble(FileReadString(obj)); for (j=100; j<=103; j++) gProp[j]=StrToDouble(FileReadString(obj));
					for (j=200; j<=203; j++) gProp[j]=StrToDouble(FileReadString(obj)); for (j=210; j<=231; j++) gProp[j]=StrToDouble(FileReadString(obj));
					
					if (ObjectFind(name)<0) { ObjectCreate(name, gType, 0, 0, 0); b=true; bNeedUpdate=true; }
					else 
					{
						// áåð¸ì äàííûå
						sType=ObjectType(name);  // òèï îáúåêòà
						sText=ObjectDescription(name); // òåêñò îáúåêòà
						for (j=0; j<=16; j++) sProp[j]=ObjectGet(name, j); for (j=100; j<=103; j++) sProp[j]=ObjectGet(name, j);
						for (j=200; j<=203; j++) sProp[j]=ObjectGet(name, j); for (j=210; j<=231; j++) sProp[j]=ObjectGet(name, j);
						if (IsDifObject()) { b=true; bNeedUpdate=true; }// åñëè îáúåêòû îòëè÷àþòñÿ, òî áóäåì îáíîâëÿòü
					}
					if (b)
					{
						ObjectSetText(name, gText); 
						for (j=0; j<=16; j++) ObjectSet(name, j, gProp[j]); for (j=100; j<=103; j++) ObjectSet(name, j, gProp[j]);
						for (j=200; j<=203; j++) ObjectSet(name, j, gProp[j]); for (j=210; j<=231; j++) ObjectSet(name, j, gProp[j]);
					}
				}

				FileClose(obj); // çàêðûëè ôàéë
				GlobalVariableSet("DupelSync", 0); // ðàçðåøèëè ðàáîòó ñ ôàéëîì
				if (bNeedUpdate) WindowRedraw(); // ïåðåðèñîâàëè
			}
		}
	}
	return(0);
}
//+------------------------------------------------------------------+
bool IsDifObject()
{
	int j;
	if (gType!=sType) return (true);
	if (gText!=sText) return (true);
	for (j=0; j<=16; j++) if (gProp[j]!=sProp[j]) return (true);
	for (j=100; j<=103; j++) if (gProp[j]!=sProp[j]) return (true);
	for (j=200; j<=203; j++) if (gProp[j]!=sProp[j]) return (true);
	for (j=210; j<=231; j++) if (gProp[j]!=sProp[j]) return (true);
}



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

Uses files from the file system

It writes information to file
It reads information from a file